diff options
author | Stephen Hines <srhines@google.com> | 2015-03-23 12:10:34 -0700 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2015-03-23 12:10:34 -0700 |
commit | ebe69fe11e48d322045d5949c83283927a0d790b (patch) | |
tree | c92f1907a6b8006628a4b01615f38264d29834ea /test/Transforms/LICM | |
parent | b7d2e72b02a4cb8034f32f8247a2558d2434e121 (diff) | |
download | external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.zip external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.tar.gz external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.tar.bz2 |
Update aosp/master LLVM for rebase to r230699.
Change-Id: I2b5be30509658cb8266be782de0ab24f9099f9b9
Diffstat (limited to 'test/Transforms/LICM')
-rw-r--r-- | test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll | 14 | ||||
-rw-r--r-- | test/Transforms/LICM/constexpr.ll | 46 | ||||
-rw-r--r-- | test/Transforms/LICM/debug-value.ll | 56 | ||||
-rw-r--r-- | test/Transforms/LICM/hoist-invariant-load.ll | 2 | ||||
-rw-r--r-- | test/Transforms/LICM/preheader-safe.ll | 69 | ||||
-rw-r--r-- | test/Transforms/LICM/promote-order.ll | 10 | ||||
-rw-r--r-- | test/Transforms/LICM/scalar_promote.ll | 12 | ||||
-rw-r--r-- | test/Transforms/LICM/sinking.ll | 78 |
8 files changed, 240 insertions, 47 deletions
diff --git a/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll b/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll index 7cf7a32..5587142 100644 --- a/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll +++ b/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll @@ -30,10 +30,10 @@ for.end: ; preds = %for.inc ret void } -!0 = metadata !{metadata !5, metadata !5, i64 0} -!1 = metadata !{metadata !"omnipotent char", metadata !2} -!2 = metadata !{metadata !"Simple C/C++ TBAA", null} -!3 = metadata !{metadata !"short", metadata !1} -!4 = metadata !{metadata !6, metadata !6, i64 0} -!5 = metadata !{metadata !"any pointer", metadata !1} -!6 = metadata !{metadata !"int", metadata !1} +!0 = !{!5, !5, i64 0} +!1 = !{!"omnipotent char", !2} +!2 = !{!"Simple C/C++ TBAA", null} +!3 = !{!"short", !1} +!4 = !{!6, !6, i64 0} +!5 = !{!"any pointer", !1} +!6 = !{!"int", !1} diff --git a/test/Transforms/LICM/constexpr.ll b/test/Transforms/LICM/constexpr.ll new file mode 100644 index 0000000..f788787 --- /dev/null +++ b/test/Transforms/LICM/constexpr.ll @@ -0,0 +1,46 @@ +; RUN: opt < %s -S -basicaa -licm | FileCheck %s +; This fixes PR22460 + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc" + +@in = internal unnamed_addr global i32* null, align 8 +@out = internal unnamed_addr global i32* null, align 8 + +; CHECK-LABEL: @bar +; CHECK: entry: +; CHECK: load i64* bitcast (i32** @in to i64*) +; CHECK: do.body: +; CHECK-NOT: load + +define i64 @bar(i32 %N) { +entry: + br label %do.body + +do.body: ; preds = %l2, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc, %l2 ] + %total = phi i64 [ 0, %entry ], [ %next, %l2 ] + %c = icmp eq i32 %N, 6 + br i1 %c, label %l1, label %do.body.l2_crit_edge + +do.body.l2_crit_edge: ; preds = %do.body + %inval.pre = load i32** @in, align 8 + br label %l2 + +l1: ; preds = %do.body + %v1 = load i64* bitcast (i32** @in to i64*), align 8 + store i64 %v1, i64* bitcast (i32** @out to i64*), align 8 + %0 = inttoptr i64 %v1 to i32* + br label %l2 + +l2: ; preds = %do.body.l2_crit_edge, %l1 + %inval = phi i32* [ %inval.pre, %do.body.l2_crit_edge ], [ %0, %l1 ] + %int = ptrtoint i32* %inval to i64 + %next = add i64 %total, %int + %inc = add nsw i32 %i.0, 1 + %cmp = icmp slt i32 %inc, %N + br i1 %cmp, label %do.body, label %do.end + +do.end: ; preds = %l2 + ret i64 %total +} diff --git a/test/Transforms/LICM/debug-value.ll b/test/Transforms/LICM/debug-value.ll index 0e0cd39..b49c559 100644 --- a/test/Transforms/LICM/debug-value.ll +++ b/test/Transforms/LICM/debug-value.ll @@ -15,7 +15,7 @@ if.then: ; preds = %for.body if.then27: ; preds = %if.then ; CHECK: tail call void @llvm.dbg.value - tail call void @llvm.dbg.value(metadata !18, i64 0, metadata !19, metadata !{}), !dbg !21 + tail call void @llvm.dbg.value(metadata double undef, i64 0, metadata !19, metadata !{}), !dbg !21 br label %for.body61.us if.end.if.end.split_crit_edge.critedge: ; preds = %if.then @@ -36,30 +36,30 @@ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnon !llvm.module.flags = !{!26} !llvm.dbg.sp = !{!0, !6, !9, !10} -!0 = metadata !{metadata !"0x2e\00idamax\00idamax\00\00112\000\001\000\006\00256\000\000", metadata !25, metadata !1, metadata !3, i32 0, null, null, null, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{metadata !"0x29", metadata !25} ; [ DW_TAG_file_type ] -!2 = metadata !{metadata !"0x11\0012\00clang version 2.9 (trunk 127169)\001\00\000\00\000", metadata !25, metadata !8, metadata !8, metadata !8, null, null} ; [ DW_TAG_compile_unit ] -!3 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", metadata !25, metadata !1, null, metadata !4, i32 0} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, metadata !2} ; [ DW_TAG_base_type ] -!6 = metadata !{metadata !"0x2e\00dscal\00dscal\00\00206\000\001\000\006\00256\000\000", metadata !25, metadata !1, metadata !7, i32 0, null, null, null, null} ; [ DW_TAG_subprogram ] -!7 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", metadata !25, metadata !1, null, metadata !8, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!8 = metadata !{null} -!9 = metadata !{metadata !"0x2e\00daxpy\00daxpy\00\00230\000\001\000\006\00256\000\000", metadata !25, metadata !1, metadata !7, i32 0, null, null, null, null} ; [ DW_TAG_subprogram ] -!10 = metadata !{metadata !"0x2e\00dgefa\00dgefa\00\00267\000\001\000\006\00256\000\000", metadata !25, metadata !1, metadata !7, null, null, null, null, null} ; [ DW_TAG_subprogram ] [line 267] [def] [scope 0] [dgefa] -!11 = metadata !{i32 281, i32 9, metadata !12, null} -!12 = metadata !{metadata !"0xb\00272\005\0032", metadata !25, metadata !13} ; [ DW_TAG_lexical_block ] -!13 = metadata !{metadata !"0xb\00271\005\0031", metadata !25, metadata !14} ; [ DW_TAG_lexical_block ] -!14 = metadata !{metadata !"0xb\00267\001\0030", metadata !25, metadata !10} ; [ DW_TAG_lexical_block ] -!15 = metadata !{i32 271, i32 5, metadata !14, null} -!16 = metadata !{i32 284, i32 10, metadata !17, null} -!17 = metadata !{metadata !"0xb\00282\009\0033", metadata !25, metadata !12} ; [ DW_TAG_lexical_block ] -!18 = metadata !{double undef} -!19 = metadata !{metadata !"0x100\00temp\00268\000", metadata !14, metadata !1, metadata !20} ; [ DW_TAG_auto_variable ] -!20 = metadata !{metadata !"0x24\00double\000\0064\0064\000\000\004", null, metadata !2} ; [ DW_TAG_base_type ] -!21 = metadata !{i32 286, i32 14, metadata !22, null} -!22 = metadata !{metadata !"0xb\00285\0013\0034", metadata !25, metadata !17} ; [ DW_TAG_lexical_block ] -!23 = metadata !{i32 296, i32 13, metadata !17, null} -!24 = metadata !{i32 313, i32 1, metadata !14, null} -!25 = metadata !{metadata !"/Volumes/Lalgate/work/llvm/projects/llvm-test/SingleSource/Benchmarks/CoyoteBench/lpbench.c", metadata !"/private/tmp"} -!26 = metadata !{i32 1, metadata !"Debug Info Version", i32 2} +!0 = !{!"0x2e\00idamax\00idamax\00\00112\000\001\000\006\00256\000\000", !25, !1, !3, i32 0, null, null, null, null} ; [ DW_TAG_subprogram ] +!1 = !{!"0x29", !25} ; [ DW_TAG_file_type ] +!2 = !{!"0x11\0012\00clang version 2.9 (trunk 127169)\001\00\000\00\000", !25, !8, !8, !8, null, null} ; [ DW_TAG_compile_unit ] +!3 = !{!"0x15\00\000\000\000\000\000\000", !25, !1, null, !4, i32 0} ; [ DW_TAG_subroutine_type ] +!4 = !{!5} +!5 = !{!"0x24\00int\000\0032\0032\000\000\005", null, !2} ; [ DW_TAG_base_type ] +!6 = !{!"0x2e\00dscal\00dscal\00\00206\000\001\000\006\00256\000\000", !25, !1, !7, i32 0, null, null, null, null} ; [ DW_TAG_subprogram ] +!7 = !{!"0x15\00\000\000\000\000\000\000", !25, !1, null, !8, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = !{null} +!9 = !{!"0x2e\00daxpy\00daxpy\00\00230\000\001\000\006\00256\000\000", !25, !1, !7, i32 0, null, null, null, null} ; [ DW_TAG_subprogram ] +!10 = !{!"0x2e\00dgefa\00dgefa\00\00267\000\001\000\006\00256\000\000", !25, !1, !7, null, null, null, null, null} ; [ DW_TAG_subprogram ] [line 267] [def] [scope 0] [dgefa] +!11 = !MDLocation(line: 281, column: 9, scope: !12) +!12 = !{!"0xb\00272\005\0032", !25, !13} ; [ DW_TAG_lexical_block ] +!13 = !{!"0xb\00271\005\0031", !25, !14} ; [ DW_TAG_lexical_block ] +!14 = !{!"0xb\00267\001\0030", !25, !10} ; [ DW_TAG_lexical_block ] +!15 = !MDLocation(line: 271, column: 5, scope: !14) +!16 = !MDLocation(line: 284, column: 10, scope: !17) +!17 = !{!"0xb\00282\009\0033", !25, !12} ; [ DW_TAG_lexical_block ] +!18 = !{double undef} +!19 = !{!"0x100\00temp\00268\000", !14, !1, !20} ; [ DW_TAG_auto_variable ] +!20 = !{!"0x24\00double\000\0064\0064\000\000\004", null, !2} ; [ DW_TAG_base_type ] +!21 = !MDLocation(line: 286, column: 14, scope: !22) +!22 = !{!"0xb\00285\0013\0034", !25, !17} ; [ DW_TAG_lexical_block ] +!23 = !MDLocation(line: 296, column: 13, scope: !17) +!24 = !MDLocation(line: 313, column: 1, scope: !14) +!25 = !{!"/Volumes/Lalgate/work/llvm/projects/llvm-test/SingleSource/Benchmarks/CoyoteBench/lpbench.c", !"/private/tmp"} +!26 = !{i32 1, !"Debug Info Version", i32 2} diff --git a/test/Transforms/LICM/hoist-invariant-load.ll b/test/Transforms/LICM/hoist-invariant-load.ll index 1ba94d6..59904ba 100644 --- a/test/Transforms/LICM/hoist-invariant-load.ll +++ b/test/Transforms/LICM/hoist-invariant-load.ll @@ -37,4 +37,4 @@ for.end: ; preds = %for.cond declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind -!0 = metadata !{} +!0 = !{} diff --git a/test/Transforms/LICM/preheader-safe.ll b/test/Transforms/LICM/preheader-safe.ll new file mode 100644 index 0000000..260a5f6 --- /dev/null +++ b/test/Transforms/LICM/preheader-safe.ll @@ -0,0 +1,69 @@ +; RUN: opt -S -licm < %s | FileCheck %s + +declare void @use_nothrow(i64 %a) nounwind +declare void @use(i64 %a) + +define void @nothrow(i64 %x, i64 %y, i1* %cond) { +; CHECK-LABEL: nothrow +; CHECK-LABEL: entry +; CHECK: %div = udiv i64 %x, %y +; CHECK-LABEL: loop +; CHECK: call void @use_nothrow(i64 %div) +entry: + br label %loop + +loop: ; preds = %entry, %for.inc + %div = udiv i64 %x, %y + call void @use_nothrow(i64 %div) + br label %loop +} +; Negative test +define void @throw_header(i64 %x, i64 %y, i1* %cond) { +; CHECK-LABEL: throw_header +; CHECK-LABEL: loop +; CHECK: %div = udiv i64 %x, %y +; CHECK: call void @use(i64 %div) +entry: + br label %loop + +loop: ; preds = %entry, %for.inc + %div = udiv i64 %x, %y + call void @use(i64 %div) + br label %loop +} + +; The header is known no throw, but the loop is not. We can +; still lift out of the header. +define void @nothrow_header(i64 %x, i64 %y, i1 %cond) { +; CHECK-LABEL: nothrow_header +; CHECK-LABEL: entry +; CHECK: %div = udiv i64 %x, %y +; CHECK-LABEL: loop +; CHECK: call void @use(i64 %div) +entry: + br label %loop +loop: ; preds = %entry, %for.inc + %div = udiv i64 %x, %y + br i1 %cond, label %loop-if, label %exit +loop-if: + call void @use(i64 %div) + br label %loop +exit: + ret void +} +; Negative test - can't move out of throwing block +define void @nothrow_header_neg(i64 %x, i64 %y, i1 %cond) { +; CHECK-LABEL: nothrow_header_neg +; CHECK-LABEL: entry +; CHECK-LABEL: loop +; CHECK: %div = udiv i64 %x, %y +; CHECK: call void @use(i64 %div) +entry: + br label %loop +loop: ; preds = %entry, %for.inc + br label %loop-if +loop-if: + %div = udiv i64 %x, %y + call void @use(i64 %div) + br label %loop +} diff --git a/test/Transforms/LICM/promote-order.ll b/test/Transforms/LICM/promote-order.ll index 86f11fe..a189cf2 100644 --- a/test/Transforms/LICM/promote-order.ll +++ b/test/Transforms/LICM/promote-order.ll @@ -36,8 +36,8 @@ for.end: ; preds = %for.cond.for.end_cr ret i32* %r.0.lcssa } -!0 = metadata !{metadata !"minimal TBAA"} -!1 = metadata !{metadata !3, metadata !3, i64 0} -!2 = metadata !{metadata !4, metadata !4, i64 0} -!3 = metadata !{metadata !"float", metadata !0} -!4 = metadata !{metadata !"int", metadata !0} +!0 = !{!"minimal TBAA"} +!1 = !{!3, !3, i64 0} +!2 = !{!4, !4, i64 0} +!3 = !{!"float", !0} +!4 = !{!"int", !0} diff --git a/test/Transforms/LICM/scalar_promote.ll b/test/Transforms/LICM/scalar_promote.ll index d7e7c6e..80afb3c 100644 --- a/test/Transforms/LICM/scalar_promote.ll +++ b/test/Transforms/LICM/scalar_promote.ll @@ -185,9 +185,9 @@ for.end: ; preds = %for.cond.for.end_cr ; CHECK-NEXT: store i32 %[[LCSSAPHI]], i32* %gi, align 4, !tbaa !0 } -!0 = metadata !{metadata !4, metadata !4, i64 0} -!1 = metadata !{metadata !"omnipotent char", metadata !2} -!2 = metadata !{metadata !"Simple C/C++ TBAA"} -!3 = metadata !{metadata !5, metadata !5, i64 0} -!4 = metadata !{metadata !"int", metadata !1} -!5 = metadata !{metadata !"float", metadata !1} +!0 = !{!4, !4, i64 0} +!1 = !{!"omnipotent char", !2} +!2 = !{!"Simple C/C++ TBAA"} +!3 = !{!5, !5, i64 0} +!4 = !{!"int", !1} +!5 = !{!"float", !1} diff --git a/test/Transforms/LICM/sinking.ll b/test/Transforms/LICM/sinking.ll index ccc9186..d7a8fcd 100644 --- a/test/Transforms/LICM/sinking.ll +++ b/test/Transforms/LICM/sinking.ll @@ -314,6 +314,84 @@ exit: ret i32 %lcssa } +; Can't sink stores out of exit blocks containing indirectbr instructions +; because loop simplify does not create dedicated exits for such blocks. Test +; that by sinking the store from lab21 to lab22, but not further. +define void @test12() { +; CHECK-LABEL: @test12 + br label %lab4 + +lab4: + br label %lab20 + +lab5: + br label %lab20 + +lab6: + br label %lab4 + +lab7: + br i1 undef, label %lab8, label %lab13 + +lab8: + br i1 undef, label %lab13, label %lab10 + +lab10: + br label %lab7 + +lab13: + ret void + +lab20: + br label %lab21 + +lab21: +; CHECK: lab21: +; CHECK-NOT: store +; CHECK: br i1 false, label %lab21, label %lab22 + store i32 36127957, i32* undef, align 4 + br i1 undef, label %lab21, label %lab22 + +lab22: +; CHECK: lab22: +; CHECK: store +; CHECK-NEXT: indirectbr i8* undef + indirectbr i8* undef, [label %lab5, label %lab6, label %lab7] +} + +; Test that we don't crash when trying to sink stores and there's no preheader +; available (which is used for creating loads that may be used by the SSA +; updater) +define void @test13() { +; CHECK-LABEL: @test13 + br label %lab59 + +lab19: + br i1 undef, label %lab20, label %lab38 + +lab20: + br label %lab60 + +lab21: + br i1 undef, label %lab22, label %lab38 + +lab22: + br label %lab38 + +lab38: + ret void + +lab59: + indirectbr i8* undef, [label %lab60, label %lab38] + +lab60: +; CHECK: lab60: +; CHECK: store +; CHECK-NEXT: indirectbr + store i32 2145244101, i32* undef, align 4 + indirectbr i8* undef, [label %lab21, label %lab19] +} + declare void @f(i32*) declare void @g() |