Files
clang-p2996/polly/test/ScopInfo/BoundChecks/single-loop.ll
Tobias Grosser f4ee371e60 tests: Drop -polly-detect-unprofitable and -polly-no-early-exit
These flags are now always passed to all tests and need to be disabled if
not needed. Disabling these flags, rather than passing them to almost all
tests, significantly simplfies our RUN: lines.

llvm-svn: 249422
2015-10-06 15:36:44 +00:00

91 lines
3.1 KiB
LLVM

; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
; RUN: opt %loadPolly -polly-ast -analyze < %s | FileCheck %s --check-prefix=AST
;
; This only works after the post-dominator tree has been fixed.
;
; XFAIL: *
;
; void exception() __attribute__((noreturn));
;
; void foo(long n, float A[100]) {
; for (long i = 0; i < n; i++) {
; if (i < 0)
; exception();
;
; if (i >= 100)
; exception();
;
; A[i] += i;
; }
; }
; We should detect this kernel as a SCoP and derive run-time conditions such
; that the bound-checked blocks are not part of the optimized SCoP.
; CHECK: Assumed Context:
; CHECK: [n] -> { : n <= 100 }
; AST: if (n <= 100)
; AST: for (int c0 = 0; c0 <= min(99, n - 1); c0 += 1)
; AST: Stmt_if_end_4(c0);
;
; AST-NOT: for
; AST-NOT: Stmt
;
; AST: else
; AST: { /* original code */ }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
; Function Attrs: nounwind uwtable
define void @foo(i64 %n, float* %A) #0 {
entry:
br label %for.cond
for.cond: ; preds = %for.inc, %entry
%i.0 = phi i64 [ 0, %entry ], [ %inc, %for.inc ]
%cmp = icmp slt i64 %i.0, %n
br i1 %cmp, label %for.body, label %for.end
for.body: ; preds = %for.cond
br i1 false, label %if.then, label %if.end
if.then: ; preds = %for.body
call void (...) @exception() #2
unreachable
if.end: ; preds = %for.body
%cmp2 = icmp sgt i64 %i.0, 99
br i1 %cmp2, label %if.then.3, label %if.end.4
if.then.3: ; preds = %if.end
call void (...) @exception() #2
unreachable
if.end.4: ; preds = %if.end
%conv = sitofp i64 %i.0 to float
%arrayidx = getelementptr inbounds float, float* %A, i64 %i.0
%tmp = load float, float* %arrayidx, align 4
%add = fadd float %tmp, %conv
store float %add, float* %arrayidx, align 4
br label %for.inc
for.inc: ; preds = %if.end.4
%inc = add nuw nsw i64 %i.0, 1
br label %for.cond
for.end: ; preds = %for.cond
ret void
}
; Function Attrs: noreturn
declare void @exception(...) #1
attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { noreturn "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { noreturn nounwind }
!llvm.ident = !{!0}
!0 = !{!"clang version 3.8.0 (trunk 246853)"}