We utilize assumptions on the input to model IR in polyhedral world. To verify these assumptions we version the code and guard it with a runtime-check (RTC). However, since the RTCs are themselves generated from the polyhedral representation we generate them under the same assumptions that they should verify. In other words, the guarantees that we try to provide with the RTCs do not hold for the RTCs themselves. To this end it is necessary to employ a different check for the RTCs that will verify the assumptions did hold for them too. Differential Revision: http://reviews.llvm.org/D20165 llvm-svn: 269299
95 lines
4.0 KiB
LLVM
95 lines
4.0 KiB
LLVM
; RUN: opt %loadPolly -S -polly-codegen < %s | FileCheck %s
|
|
;
|
|
; Check that we calculate the maximal access into array A correctly and track the overflow state.
|
|
;
|
|
; CHECK: %[[TMP0:[._0-9a-zA-Z]*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 99, i64 %m)
|
|
; CHECK: %[[TMP0O:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP0]], 1
|
|
; CHECK: %[[OS0:[._0-9a-zA-Z]*]] = or i1 {{[^,]*}}, %[[TMP0O]]
|
|
; CHECK: %[[TMP0R:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP0]], 0
|
|
; CHECK: %[[TMP1:[._0-9a-zA-Z]*]] = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %[[TMP0R]], i64 149)
|
|
; CHECK: %[[TMP1O:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP1]], 1
|
|
; CHECK: %[[OS1:[._0-9a-zA-Z]*]] = or i1 %[[OS0]], %[[TMP1O]]
|
|
; CHECK: %[[TMP1R:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP1]], 0
|
|
; CHECK: %[[TMP2:[._0-9a-zA-Z]*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 %[[TMP1R]], i64 %p)
|
|
; CHECK: %[[TMP2O:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP2]], 1
|
|
; CHECK: %[[OS2:[._0-9a-zA-Z]*]] = or i1 %[[OS1]], %[[TMP2O]]
|
|
; CHECK: %[[TMP2R:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP2]], 0
|
|
; CHECK: %[[TMP3:[._0-9a-zA-Z]*]] = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %[[TMP2R]], i64 150)
|
|
; CHECK: %[[TMP3O:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP3]], 1
|
|
; CHECK: %[[OS3:[._0-9a-zA-Z]*]] = or i1 %[[OS2]], %[[TMP3O]]
|
|
; CHECK: %[[TMP3R:[._0-9a-zA-Z]*]] = extractvalue { i64, i1 } %[[TMP3]], 0
|
|
; CHECK: %polly.access.A{{[0-9]*}} = getelementptr double, double* %A, i64 %[[TMP3R]]
|
|
;
|
|
; CHECK: %polly.rtc.overflown = xor i1 %[[OS3]], true
|
|
; CHECK: %polly.rtc.result = and i1 %{{[^,]*}}, %polly.rtc.overflown
|
|
; CHECK: br i1 %polly.rtc.result,
|
|
;
|
|
; void foo(long n, long m, long p, double A[n][m][p], int *B) {
|
|
; for (long i = 0; i < 100; i++)
|
|
; for (long j = 0; j < 150; j++)
|
|
; for (long k = 0; k < 150; k++)
|
|
; A[i][j][k] = B[k];
|
|
; }
|
|
;
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
define void @foo(i64 %n, i64 %m, i64 %p, double* %A, i32* %B) {
|
|
entry:
|
|
br label %for.cond
|
|
|
|
for.cond: ; preds = %for.inc03, %entry
|
|
%i.0 = phi i64 [ 0, %entry ], [ %inc04, %for.inc03 ]
|
|
%exitcond2 = icmp ne i64 %i.0, 100
|
|
br i1 %exitcond2, label %for.body, label %for.end15
|
|
|
|
for.body: ; preds = %for.cond
|
|
br label %for.cond1
|
|
|
|
for.cond1: ; preds = %for.inc00, %for.body
|
|
%j.0 = phi i64 [ 0, %for.body ], [ %inc01, %for.inc00 ]
|
|
%exitcond1 = icmp ne i64 %j.0, 150
|
|
br i1 %exitcond1, label %for.body3, label %for.end12
|
|
|
|
for.body3: ; preds = %for.cond1
|
|
br label %for.cond4
|
|
|
|
for.cond4: ; preds = %for.inc, %for.body3
|
|
%k.0 = phi i64 [ 0, %for.body3 ], [ %inc, %for.inc ]
|
|
%exitcond = icmp ne i64 %k.0, 150
|
|
br i1 %exitcond, label %for.body6, label %for.end
|
|
|
|
for.body6: ; preds = %for.cond4
|
|
%arrayidx = getelementptr inbounds i32, i32* %B, i64 %k.0
|
|
%tmp3 = load i32, i32* %arrayidx, align 2
|
|
%conv = sitofp i32 %tmp3 to double
|
|
%tmp4 = mul nuw i64 %m, %p
|
|
%tmp5 = mul nsw i64 %i.0, %tmp4
|
|
%tmp6 = mul nsw i64 %j.0, %p
|
|
%arrayidx7.sum = add i64 %tmp5, %tmp6
|
|
%arrayidx8.sum = add i64 %arrayidx7.sum, %k.0
|
|
%arrayidx9 = getelementptr inbounds double, double* %A, i64 %arrayidx8.sum
|
|
store double %conv, double* %arrayidx9, align 8
|
|
br label %for.inc
|
|
|
|
for.inc: ; preds = %for.body6
|
|
%inc = add nsw i64 %k.0, 1
|
|
br label %for.cond4
|
|
|
|
for.end: ; preds = %for.cond4
|
|
br label %for.inc00
|
|
|
|
for.inc00: ; preds = %for.end
|
|
%inc01 = add nsw i64 %j.0, 1
|
|
br label %for.cond1
|
|
|
|
for.end12: ; preds = %for.cond1
|
|
br label %for.inc03
|
|
|
|
for.inc03: ; preds = %for.end12
|
|
%inc04 = add nsw i64 %i.0, 1
|
|
br label %for.cond
|
|
|
|
for.end15: ; preds = %for.cond
|
|
ret void
|
|
}
|