2017-08-16 08:18:39 +08:00
; XFAIL: *
; The test case stopped making sense after r310940 that added infinite loops to
2017-08-25 03:47:15 +08:00
; the PostDominatorTree. Infinite loops are postdominated ony by the virtual
2017-08-16 08:18:39 +08:00
; root, which causes them not to appear in regions in ScopDetection anymore.
2016-09-21 01:05:22 +08:00
; RUN: opt %loadPolly -pass-remarks-missed="polly-detect" -polly-allow-nonaffine-loops -analyze -polly-detect < %s 2>&1 | FileCheck %s
; RUN: opt %loadPolly -pass-remarks-missed="polly-detect" -polly-allow-nonaffine-loops=false -analyze -polly-detect < %s 2>&1 | FileCheck %s
2016-06-28 03:00:49 +08:00
; void func (int param0, int N, int *A)
; {
; for (int i = 0; i < N; i++)
; if (param0)
; while (1)
; A[i] = 1;
; else
; A[i] = 2;
; }
2016-09-21 01:05:22 +08:00
; CHECK: remark: ReportLoopHasNoExit.c:7:7: Loop cannot be handled because it has no exit.
2016-06-28 03:00:49 +08:00
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
; Function Attrs: nounwind uwtable
define void @func ( i32 %param0 , i32 %N , i32 * %A ) #0 !dbg !6 {
entry:
%param0.addr = alloca i32 , align 4
%N.addr = alloca i32 , align 4
%A.addr = alloca i32 * , align 8
%i = alloca i32 , align 4
store i32 %param0 , i32 * %param0.addr , align 4
store i32 %N , i32 * %N.addr , align 4
store i32 * %A , i32 * * %A.addr , align 8
store i32 0 , i32 * %i , align 4
br label %for.cond
for.cond: ; preds = %for.inc, %entry
%0 = load i32 , i32 * %i , align 4
%1 = load i32 , i32 * %N.addr , align 4
%cmp = icmp slt i32 %0 , %1
br i1 %cmp , label %for.body , label %for.end , !dbg !27
for.body: ; preds = %for.cond
%2 = load i32 , i32 * %param0.addr , align 4
%tobool = icmp ne i32 %2 , 0
br i1 %tobool , label %if.then , label %if.else
if.then: ; preds = %for.body
br label %while.body
while.body: ; preds = %if.then, %while.body
%3 = load i32 , i32 * %i , align 4
%idxprom = sext i32 %3 to i64
%4 = load i32 * , i32 * * %A.addr , align 8
%arrayidx = getelementptr inbounds i32 , i32 * %4 , i64 %idxprom
store i32 1 , i32 * %arrayidx , align 4
br label %while.body , !dbg !37
if.else: ; preds = %for.body
%5 = load i32 , i32 * %i , align 4
%idxprom1 = sext i32 %5 to i64
%6 = load i32 * , i32 * * %A.addr , align 8
%arrayidx2 = getelementptr inbounds i32 , i32 * %6 , i64 %idxprom1
store i32 2 , i32 * %arrayidx2 , align 4
br label %if.end
if.end: ; preds = %if.else
br label %for.inc
for.inc: ; preds = %if.end
%7 = load i32 , i32 * %i , align 4
%inc = add nsw i32 %7 , 1
store i32 %inc , i32 * %i , align 4
br label %for.cond
for.end: ; preds = %for.cond
ret void
}
; Function Attrs: nounwind readnone
declare void @llvm.dbg.declare ( metadata , metadata , metadata ) #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-jump-tables" = "false" "no-nans-fp-math" = "false" "stack-protector-buffer-size" = "8" "target-cpu" = "x86-64" "target-features" = "+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math" = "false" "use-soft-float" = "false" }
attributes #1 = { nounwind readnone }
!llvm.dbg.cu = ! { !0 }
!llvm.module.flags = ! { !3 , !4 }
!llvm.ident = ! { !5 }
!0 = distinct !DICompileUnit ( language: D W _ L A N G _ C 99 , file: !1 , producer: "clang version 3.9.0 " , isOptimized: false , runtimeVersion: 0 , emissionKind: F u l l D e b u g , enums: !2 )
2016-09-21 01:05:22 +08:00
!1 = !DIFile ( filename: "ReportLoopHasNoExit.c" , directory: "test/ScopDetectionDiagnostics/" )
2016-06-28 03:00:49 +08:00
!2 = ! { }
!3 = ! { i32 2 , !"Dwarf Version" , i32 4 }
!4 = ! { i32 2 , !"Debug Info Version" , i32 3 }
!5 = ! { !"clang version 3.9.0 " }
2018-05-10 15:09:10 +08:00
!6 = distinct !DISubprogram ( name: "func" , scope: !1 , file: !1 , line: 1 , isLocal: false , isDefinition: true , scopeLine: 2 , flags: D I F l a g P r o t o t y p e d , isOptimized: false , unit: !0 , retainedNodes: !2 )
2016-06-28 03:00:49 +08:00
!19 = distinct !DILexicalBlock ( scope: !6 , file: !1 , line: 3 , column: 3 )
!23 = !DILexicalBlockFile ( scope: !24 , file: !1 , discriminator: 1 )
!24 = distinct !DILexicalBlock ( scope: !19 , file: !1 , line: 3 , column: 3 )
!27 = !DILocation ( line: 3 , column: 3 , scope: !23 )
!29 = distinct !DILexicalBlock ( scope: !30 , file: !1 , line: 5 , column: 9 )
!30 = distinct !DILexicalBlock ( scope: !24 , file: !1 , line: 4 , column: 3 )
!33 = distinct !DILexicalBlock ( scope: !29 , file: !1 , line: 6 , column: 5 )
!37 = !DILocation ( line: 7 , column: 7 , scope: !38 )
!38 = !DILexicalBlockFile ( scope: !33 , file: !1 , discriminator: 1 )