Files
clang-p2996/polly/test/Isl/CodeGen/pointer_rem.ll
Michael Kruse 5c527f9963 Fix modulo compared to zero.
In case of modulo compared to zero, we need to do signed modulo
operation as unsigned can give different results based on whether the
dividend is negative or not.

This addresses llvm.org/PR27707

Contributed-by: Chris Jenneisch <chrisj@codeaurora.org>

Reviewers: _jdoerfert, grosser, Meinersbur

Differential Revision: http://reviews.llvm.org/D20145

llvm-svn: 271707
2016-06-03 18:51:48 +00:00

49 lines
1.8 KiB
LLVM

; RUN: opt %loadPolly -polly-process-unprofitable -polly-code-generator=isl -polly-scops -polly-ast -analyze -S < %s | FileCheck %s --check-prefix=AST
; RUN: opt %loadPolly -polly-process-unprofitable -polly-code-generator=isl -polly-scops -polly-codegen -S < %s | FileCheck %s --check-prefix=CODEGEN
target datalayout = "e-m:e-i64:64-i128:128-n8:16:32:64-S128"
target triple = "aarch64--linux-gnu"
; This test is to ensure that for we generate signed remainder for
; the polly.cond check.
; AST: isl ast :: foo1
; AST: if ((a1 - b1) % 24 == 0)
; CODEGEN: define void @foo1
; CODEGEN: polly.cond:
; CODEGEN: %pexp.zdiv_r = srem {{.*}}, 24
%struct.A = type { i32, i64, i8 }
; Function Attrs: norecurse nounwind
define void @foo1(%struct.A* %a1, %struct.A* readnone %b1) #0 {
entry:
br label %entry.split
entry.split: ; preds = %entry
%cmp4 = icmp eq %struct.A* %a1, %b1
br i1 %cmp4, label %for.cond.cleanup, label %for.body.preheader
for.body.preheader: ; preds = %entry.split
br label %for.body
for.cond.cleanup.loopexit: ; preds = %for.body
br label %for.cond.cleanup
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry.split
ret void
for.body: ; preds = %for.body.preheader, %for.body
%start.05 = phi %struct.A* [ %incdec.ptr, %for.body ], [ %a1, %for.body.preheader ]
%a = getelementptr inbounds %struct.A, %struct.A* %start.05, i64 0, i32 0
%0 = load i32, i32* %a, align 8
%add = add nsw i32 %0, 1
store i32 %add, i32* %a, align 8
%incdec.ptr = getelementptr inbounds %struct.A, %struct.A* %start.05, i64 1
%cmp = icmp eq %struct.A* %incdec.ptr, %b1
br i1 %cmp, label %for.cond.cleanup.loopexit, label %for.body
}