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
49 lines
1.8 KiB
LLVM
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
|
|
}
|
|
|
|
|