summaryrefslogtreecommitdiffstats
path: root/test/Transforms
diff options
context:
space:
mode:
Diffstat (limited to 'test/Transforms')
-rw-r--r--test/Transforms/GVN/load-pre-align.ll2
-rw-r--r--test/Transforms/IndVarSimplify/indirectbr.ll19
-rw-r--r--test/Transforms/IndVarSimplify/single-element-range.ll2
-rw-r--r--test/Transforms/IndVarSimplify/tripcount_compute.ll66
-rw-r--r--test/Transforms/Inline/2010-05-31-ByvalTailcall.ll24
-rw-r--r--test/Transforms/InstCombine/alloca.ll20
-rw-r--r--test/Transforms/InstCombine/badmalloc.ll1
-rw-r--r--test/Transforms/InstCombine/call.ll4
-rw-r--r--test/Transforms/InstCombine/cast.ll11
-rw-r--r--test/Transforms/InstCombine/crash.ll6
-rw-r--r--test/Transforms/InstCombine/getelementptr.ll9
-rw-r--r--test/Transforms/InstCombine/icmp.ll23
-rw-r--r--test/Transforms/InstCombine/load.ll11
-rw-r--r--test/Transforms/InstCombine/load2.ll11
-rw-r--r--test/Transforms/InstCombine/load3.ll33
-rw-r--r--test/Transforms/InstCombine/malloc-free-delete.ll20
-rw-r--r--test/Transforms/InstCombine/select.ll32
-rw-r--r--test/Transforms/JumpThreading/crash.ll46
-rw-r--r--test/Transforms/LoopRotate/phi-duplicate.ll2
-rw-r--r--test/Transforms/LoopUnswitch/preserve-analyses.ll2
-rw-r--r--test/Transforms/Mem2Reg/ConvertDebugInfo.ll2
-rw-r--r--test/Transforms/Mem2Reg/ConvertDebugInfo2.ll52
-rw-r--r--test/Transforms/PartialSpecialize/dg.exp3
-rw-r--r--test/Transforms/PartialSpecialize/two-specializations.ll33
-rw-r--r--test/Transforms/ScalarRepl/2009-12-11-NeonTypes.ll4
-rw-r--r--test/Transforms/ScalarRepl/2010-01-18-SelfCopy.ll2
-rw-r--r--test/Transforms/ScalarRepl/address-space.ll35
-rw-r--r--test/Transforms/ScalarRepl/memcpy-align.ll2
-rw-r--r--test/Transforms/SimplifyCFG/trapping-load-unreachable.ll11
-rw-r--r--test/Transforms/SimplifyLibCalls/2010-05-30-memcpy-Struct.ll20
-rw-r--r--test/Transforms/SimplifyLibCalls/PR7357.ll16
-rw-r--r--test/Transforms/SimplifyLibCalls/StrNCmp.ll7
-rw-r--r--test/Transforms/SimplifyLibCalls/StrStr.ll12
-rw-r--r--test/Transforms/StripSymbols/2010-06-30-StripDebug.ll28
-rw-r--r--test/Transforms/StripSymbols/2010-07-01-DeadDbgInfo.ll47
-rw-r--r--test/Transforms/TailCallElim/2010-06-26-MultipleReturnValues.ll20
36 files changed, 593 insertions, 45 deletions
diff --git a/test/Transforms/GVN/load-pre-align.ll b/test/Transforms/GVN/load-pre-align.ll
index 3a66c0b..d8ad59f 100644
--- a/test/Transforms/GVN/load-pre-align.ll
+++ b/test/Transforms/GVN/load-pre-align.ll
@@ -4,7 +4,7 @@ target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-
@p = external global i32
-define arm_apcscc i32 @test(i32 %n) nounwind {
+define i32 @test(i32 %n) nounwind {
; CHECK: @test
entry:
br label %for.cond
diff --git a/test/Transforms/IndVarSimplify/indirectbr.ll b/test/Transforms/IndVarSimplify/indirectbr.ll
index b4ce153..a208ded 100644
--- a/test/Transforms/IndVarSimplify/indirectbr.ll
+++ b/test/Transforms/IndVarSimplify/indirectbr.ll
@@ -1,6 +1,6 @@
; RUN: opt < %s -indvars -S -disable-output
-; PR5758
+; PR5758
define zeroext i1 @foo() nounwind {
entry:
indirectbr i8* undef, [label %"202", label %"133"]
@@ -20,3 +20,20 @@ entry:
"202": ; preds = %entry
ret i1 false
}
+
+; PR7333
+define void @__atomvec_module__put_vrml_bonds() nounwind {
+bb7.preheader: ; preds = %entry
+ indirectbr i8* undef, [label %bb14, label %bb16]
+
+bb14: ; preds = %bb14, %bb7.preheader
+ br label %bb16
+
+bb16: ; preds = %bb16, %bb14, %bb7.preheader
+ %S.31.0 = phi i64 [ %3, %bb16 ], [ 1, %bb7.preheader ], [ 1, %bb14 ] ; <i64> [#uses=2]
+ %0 = add nsw i64 %S.31.0, -1 ; <i64> [#uses=1]
+ %1 = getelementptr inbounds [3 x double]* undef, i64 0, i64 %0 ; <double*> [#uses=1]
+ %2 = load double* %1, align 8 ; <double> [#uses=0]
+ %3 = add nsw i64 %S.31.0, 1 ; <i64> [#uses=1]
+ br label %bb16
+}
diff --git a/test/Transforms/IndVarSimplify/single-element-range.ll b/test/Transforms/IndVarSimplify/single-element-range.ll
index 60a9eef..4b035ee 100644
--- a/test/Transforms/IndVarSimplify/single-element-range.ll
+++ b/test/Transforms/IndVarSimplify/single-element-range.ll
@@ -3,7 +3,7 @@
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:64"
target triple = "armv6-apple-darwin10"
-define arm_apcscc void @sqlite3_free_table(i8** %azResult) nounwind {
+define void @sqlite3_free_table(i8** %azResult) nounwind {
entry:
br i1 undef, label %return, label %bb
diff --git a/test/Transforms/IndVarSimplify/tripcount_compute.ll b/test/Transforms/IndVarSimplify/tripcount_compute.ll
index 6eaa4c5..8835b96 100644
--- a/test/Transforms/IndVarSimplify/tripcount_compute.ll
+++ b/test/Transforms/IndVarSimplify/tripcount_compute.ll
@@ -1,9 +1,12 @@
+; RUN: opt < %s -indvars -S | FileCheck %s
+
; These tests ensure that we can compute the trip count of various forms of
; loops. If the trip count of the loop is computable, then we will know what
; the exit value of the loop will be for some value, allowing us to substitute
; it directly into users outside of the loop, making the loop dead.
-;
-; RUN: opt < %s -indvars -loop-deletion -simplifycfg -S | not grep br
+
+; CHECK: @linear_setne
+; CHECK: ret i32 100
define i32 @linear_setne() {
entry:
@@ -19,6 +22,9 @@ loopexit: ; preds = %loop
ret i32 %i
}
+; CHECK: @linear_setne_2
+; CHECK: ret i32 100
+
define i32 @linear_setne_2() {
entry:
br label %loop
@@ -33,6 +39,9 @@ loopexit: ; preds = %loop
ret i32 %i
}
+; CHECK: @linear_setne_overflow
+; CHECK: ret i32 0
+
define i32 @linear_setne_overflow() {
entry:
br label %loop
@@ -47,6 +56,9 @@ loopexit: ; preds = %loop
ret i32 %i
}
+; CHECK: @linear_setlt
+; CHECK: ret i32 100
+
define i32 @linear_setlt() {
entry:
br label %loop
@@ -61,6 +73,9 @@ loopexit: ; preds = %loop
ret i32 %i
}
+; CHECK: @quadratic_setlt
+; CHECK: ret i32 34
+
define i32 @quadratic_setlt() {
entry:
br label %loop
@@ -76,6 +91,9 @@ loopexit: ; preds = %loop
ret i32 %i
}
+; CHECK: @chained
+; CHECK: ret i32 200
+
define i32 @chained() {
entry:
br label %loop
@@ -98,3 +116,47 @@ loop2: ; preds = %loop2, %loopexit
loopexit2: ; preds = %loop2
ret i32 %j
}
+
+; CHECK: @chained4
+; CHECK: ret i32 400
+
+define i32 @chained4() {
+entry:
+ br label %loop
+
+loop: ; preds = %loop, %entry
+ %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] ; <i32> [#uses=3]
+ %i.next = add i32 %i, 1 ; <i32> [#uses=1]
+ %c = icmp ne i32 %i.next, 100 ; <i1> [#uses=1]
+ br i1 %c, label %loop, label %loopexit
+
+loopexit: ; preds = %loop
+ br label %loop2
+
+loop2: ; preds = %loop2, %loopexit
+ %j = phi i32 [ %i.next, %loopexit ], [ %j.next, %loop2 ] ; <i32> [#uses=3]
+ %j.next = add i32 %j, 1 ; <i32> [#uses=1]
+ %c2 = icmp ne i32 %j.next, 200 ; <i1> [#uses=1]
+ br i1 %c2, label %loop2, label %loopexit2
+
+loopexit2: ; preds = %loop
+ br label %loop8
+
+loop8: ; preds = %loop2, %loopexit
+ %k = phi i32 [ %j.next, %loopexit2 ], [ %k.next, %loop8 ] ; <i32> [#uses=3]
+ %k.next = add i32 %k, 1 ; <i32> [#uses=1]
+ %c8 = icmp ne i32 %k.next, 300 ; <i1> [#uses=1]
+ br i1 %c8, label %loop8, label %loopexit8
+
+loopexit8: ; preds = %loop2
+ br label %loop9
+
+loop9: ; preds = %loop2, %loopexit
+ %l = phi i32 [ %k.next, %loopexit8 ], [ %l.next, %loop9 ] ; <i32> [#uses=3]
+ %l.next = add i32 %l, 1 ; <i32> [#uses=1]
+ %c9 = icmp ne i32 %l.next, 400 ; <i1> [#uses=1]
+ br i1 %c9, label %loop9, label %loopexit9
+
+loopexit9: ; preds = %loop2
+ ret i32 %l.next
+}
diff --git a/test/Transforms/Inline/2010-05-31-ByvalTailcall.ll b/test/Transforms/Inline/2010-05-31-ByvalTailcall.ll
new file mode 100644
index 0000000..1ce74e6
--- /dev/null
+++ b/test/Transforms/Inline/2010-05-31-ByvalTailcall.ll
@@ -0,0 +1,24 @@
+; RUN: opt < %s -tailcallelim -inline -instcombine -dse -S | FileCheck %s
+; PR7272
+
+; When inlining through a byval call site, the inliner creates allocas which may
+; be used by inlined calls, so any inlined calls need to have their 'tail' flags
+; cleared. If not then you can get nastiness like with this testcase, where the
+; (inlined) call to 'ext' in 'foo' was being passed an uninitialized value.
+
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
+target triple = "i386-pc-linux-gnu"
+
+declare void @ext(i32*)
+
+define void @bar(i32* byval %x) {
+ call void @ext(i32* %x)
+ ret void
+}
+
+define void @foo(i32* %x) {
+; CHECK: define void @foo
+; CHECK: store i32 %1, i32* %x
+ call void @bar(i32* byval %x)
+ ret void
+}
diff --git a/test/Transforms/InstCombine/alloca.ll b/test/Transforms/InstCombine/alloca.ll
index b9add4d..e4d1367 100644
--- a/test/Transforms/InstCombine/alloca.ll
+++ b/test/Transforms/InstCombine/alloca.ll
@@ -1,12 +1,13 @@
-; Zero byte allocas should be deleted.
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
-; RUN: opt < %s -instcombine -S | \
-; RUN: not grep alloca
+; RUN: opt < %s -instcombine -S | FileCheck %s
; END.
declare void @use(...)
+; Zero byte allocas should be deleted.
+; CHECK: @test
+; CHECK-NOT: alloca
define void @test() {
%X = alloca [0 x i32] ; <[0 x i32]*> [#uses=1]
call void (...)* @use( [0 x i32]* %X )
@@ -17,12 +18,18 @@ define void @test() {
ret void
}
+; Zero byte allocas should be deleted.
+; CHECK: @test2
+; CHECK-NOT: alloca
define void @test2() {
%A = alloca i32 ; <i32*> [#uses=1]
store i32 123, i32* %A
ret void
}
+; Zero byte allocas should be deleted.
+; CHECK: @test3
+; CHECK-NOT: alloca
define void @test3() {
%A = alloca { i32 } ; <{ i32 }*> [#uses=1]
%B = getelementptr { i32 }* %A, i32 0, i32 0 ; <i32*> [#uses=1]
@@ -30,3 +37,10 @@ define void @test3() {
ret void
}
+; CHECK: @test4
+; CHECK: = zext i32 %n to i64
+; CHECK: %A = alloca i32, i64 %
+define i32* @test4(i32 %n) {
+ %A = alloca i32, i32 %n
+ ret i32* %A
+}
diff --git a/test/Transforms/InstCombine/badmalloc.ll b/test/Transforms/InstCombine/badmalloc.ll
index cab23b5..f5a623d 100644
--- a/test/Transforms/InstCombine/badmalloc.ll
+++ b/test/Transforms/InstCombine/badmalloc.ll
@@ -10,6 +10,7 @@ declare void @free(i8*)
define i1 @test1() {
%A = call noalias i8* @malloc(i64 4) nounwind
%B = icmp eq i8* %A, null
+ store i8 0, i8* %A
call void @free(i8* %A)
ret i1 %B
diff --git a/test/Transforms/InstCombine/call.ll b/test/Transforms/InstCombine/call.ll
index dd65b96..c256724 100644
--- a/test/Transforms/InstCombine/call.ll
+++ b/test/Transforms/InstCombine/call.ll
@@ -100,7 +100,7 @@ define void @test7() {
declare void @test8a()
define i8* @test8() {
- invoke arm_apcscc void @test8a()
+ invoke void @test8a()
to label %invoke.cont unwind label %try.handler
invoke.cont: ; preds = %entry
@@ -114,5 +114,5 @@ try.handler: ; preds = %entry
; calling conv, but the implementation of test8a may actually end up using the
; right calling conv.
; CHECK: @test8() {
-; CHECK-NEXT: invoke arm_apcscc void @test8a()
+; CHECK-NEXT: invoke void @test8a()
diff --git a/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll
index 77fccdf..102d2f0 100644
--- a/test/Transforms/InstCombine/cast.ll
+++ b/test/Transforms/InstCombine/cast.ll
@@ -638,3 +638,14 @@ define <4 x i32> @test62(<3 x float> %call4) nounwind {
; CHECK-NEXT: ret
}
+; PR7311 - Don't create invalid IR on scalar->vector cast.
+define <2 x float> @test63(i64 %tmp8) nounwind {
+entry:
+ %a = bitcast i64 %tmp8 to <2 x i32>
+ %vcvt.i = uitofp <2 x i32> %a to <2 x float>
+ ret <2 x float> %vcvt.i
+; CHECK: @test63
+; CHECK: bitcast
+; CHECK: uitofp
+}
+
diff --git a/test/Transforms/InstCombine/crash.ll b/test/Transforms/InstCombine/crash.ll
index 854bfc8..30d467e 100644
--- a/test/Transforms/InstCombine/crash.ll
+++ b/test/Transforms/InstCombine/crash.ll
@@ -127,11 +127,11 @@ l10:
}
; PR5471
-define arm_apcscc i32 @test5a() {
+define i32 @test5a() {
ret i32 0
}
-define arm_apcscc void @test5() {
+define void @test5() {
store i1 true, i1* undef
%1 = invoke i32 @test5a() to label %exit unwind label %exit
exit:
@@ -212,7 +212,7 @@ define i8* @test10(i8* %self, i8* %tmp3) {
entry:
store i1 true, i1* undef
store i1 true, i1* undef
- invoke arm_apcscc void @test10a()
+ invoke void @test10a()
to label %invoke.cont unwind label %try.handler ; <i8*> [#uses=0]
invoke.cont: ; preds = %entry
diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll
index f0bee4e..9e8547b 100644
--- a/test/Transforms/InstCombine/getelementptr.ll
+++ b/test/Transforms/InstCombine/getelementptr.ll
@@ -468,3 +468,12 @@ define i1 @test37() nounwind {
getelementptr ([1 x i8]* @A37, i64 1, i64 0)
ret i1 %t
}
+
+; Test index promotion
+define i32* @test38(i32* %I, i32 %n) {
+ %A = getelementptr i32* %I, i32 %n
+ ret i32* %A
+; CHECK: @test38
+; CHECK: = sext i32 %n to i64
+; CHECK: %A = getelementptr i32* %I, i64 %
+}
diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll
index 29997bf..802957f 100644
--- a/test/Transforms/InstCombine/icmp.ll
+++ b/test/Transforms/InstCombine/icmp.ll
@@ -131,3 +131,26 @@ entry:
; CHECK: ret i1 false
}
+define i1 @test14(i8 %X) nounwind readnone {
+entry:
+ %cmp = icmp slt i8 undef, -128
+ ret i1 %cmp
+; CHECK: @test14
+; CHECK: ret i1 false
+}
+
+define i1 @test15() nounwind readnone {
+entry:
+ %cmp = icmp eq i8 undef, -128
+ ret i1 %cmp
+; CHECK: @test15
+; CHECK: ret i1 undef
+}
+
+define i1 @test16() nounwind readnone {
+entry:
+ %cmp = icmp ne i8 undef, -128
+ ret i1 %cmp
+; CHECK: @test16
+; CHECK: ret i1 undef
+}
diff --git a/test/Transforms/InstCombine/load.ll b/test/Transforms/InstCombine/load.ll
index 75c62a8..d11e08e 100644
--- a/test/Transforms/InstCombine/load.ll
+++ b/test/Transforms/InstCombine/load.ll
@@ -7,6 +7,9 @@
@Y = constant [2 x { i32, float }] [ { i32, float } { i32 12, float 1.000000e+00 }, { i32, float } { i32 37, float 0x3FF3B2FEC0000000 } ] ; <[2 x { i32, float }]*> [#uses=2]
@Z = constant [2 x { i32, float }] zeroinitializer ; <[2 x { i32, float }]*> [#uses=1]
+@GLOBAL = internal constant [4 x i32] zeroinitializer
+
+
define i32 @test1() {
%B = load i32* @X ; <i32> [#uses=1]
ret i32 %B
@@ -85,3 +88,11 @@ define i32 @test12(i32* %P) {
%V = load i32* %Q
ret i32 %V
}
+
+define <16 x i8> @test13(<2 x i64> %x) {
+entry:
+ %tmp = load <16 x i8> * bitcast ([4 x i32]* @GLOBAL to <16 x i8>*)
+ ret <16 x i8> %tmp
+}
+
+
diff --git a/test/Transforms/InstCombine/load2.ll b/test/Transforms/InstCombine/load2.ll
deleted file mode 100644
index 611b0fb..0000000
--- a/test/Transforms/InstCombine/load2.ll
+++ /dev/null
@@ -1,11 +0,0 @@
-; RUN: opt < %s -instcombine -S | not grep load
-
-@GLOBAL = internal constant [4 x i32] zeroinitializer
-
-
-define <16 x i8> @foo(<2 x i64> %x) {
-entry:
- %tmp = load <16 x i8> * bitcast ([4 x i32]* @GLOBAL to <16 x i8>*)
- ret <16 x i8> %tmp
-}
-
diff --git a/test/Transforms/InstCombine/load3.ll b/test/Transforms/InstCombine/load3.ll
index 9c87316..35398e1 100644
--- a/test/Transforms/InstCombine/load3.ll
+++ b/test/Transforms/InstCombine/load3.ll
@@ -1,14 +1,27 @@
-; RUN: opt < %s -instcombine -S | grep load | count 1
+; RUN: opt < %s -instcombine -S | FileCheck %s
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-apple-darwin10.0.0"
; Instcombine should be able to do trivial CSE of loads.
-declare void @use(double %n)
-define void @bar(double* %p) {
- %t0 = getelementptr double* %p, i32 1
- %y = load double* %t0
- %t1 = getelementptr double* %p, i32 1
- %x = load double* %t1
- call void @use(double %x)
- call void @use(double %y)
- ret void
+define i32 @test1(i32* %p) {
+ %t0 = getelementptr i32* %p, i32 1
+ %y = load i32* %t0
+ %t1 = getelementptr i32* %p, i32 1
+ %x = load i32* %t1
+ %a = sub i32 %y, %x
+ ret i32 %a
+; CHECK: @test1
+; CHECK: ret i32 0
}
+
+
+; PR7429
+@.str = private constant [4 x i8] c"XYZ\00"
+define float @test2() {
+ %tmp = load float* bitcast ([4 x i8]* @.str to float*), align 1
+ ret float %tmp
+
+; CHECK: @test2
+; CHECK: ret float 0x3806965600000000
+} \ No newline at end of file
diff --git a/test/Transforms/InstCombine/malloc-free-delete.ll b/test/Transforms/InstCombine/malloc-free-delete.ll
index a4b7496..317786f 100644
--- a/test/Transforms/InstCombine/malloc-free-delete.ll
+++ b/test/Transforms/InstCombine/malloc-free-delete.ll
@@ -1,13 +1,25 @@
-; RUN: opt < %s -instcombine -globaldce -S | FileCheck %s
+; RUN: opt < %s -instcombine -S | FileCheck %s
; PR1201
define i32 @main(i32 %argc, i8** %argv) {
- %c_19 = alloca i8* ; <i8**> [#uses=2]
- %malloc_206 = malloc i8, i32 10 ; <i8*> [#uses=1]
+ %c_19 = alloca i8*
+ %malloc_206 = malloc i8, i32 10
; CHECK-NOT: malloc
store i8* %malloc_206, i8** %c_19
- %tmp_207 = load i8** %c_19 ; <i8*> [#uses=1]
+ %tmp_207 = load i8** %c_19
free i8* %tmp_207
; CHECK-NOT: free
ret i32 0
; CHECK: ret i32 0
}
+
+declare i8* @malloc(i32)
+declare void @free(i8*)
+
+define i1 @foo() {
+; CHECK: @foo
+; CHECK-NEXT: ret i1 false
+ %m = call i8* @malloc(i32 1)
+ %z = icmp eq i8* %m, null
+ call void @free(i8* %m)
+ ret i1 %z
+}
diff --git a/test/Transforms/InstCombine/select.ll b/test/Transforms/InstCombine/select.ll
index 06d5338..246a7bc 100644
--- a/test/Transforms/InstCombine/select.ll
+++ b/test/Transforms/InstCombine/select.ll
@@ -438,3 +438,35 @@ define i32 @test34(i32 %x, i32 %y) {
; CHECK: @test34
; CHECK: ret i32 %x
}
+
+define i32 @test35(i32 %x) {
+ %cmp = icmp sge i32 %x, 0
+ %cond = select i1 %cmp, i32 60, i32 100
+ ret i32 %cond
+; CHECK: @test35
+; CHECK: ashr i32 %x, 31
+; CHECK: and i32 {{.*}}, 40
+; CHECK: add i32 {{.*}}, 60
+; CHECK: ret
+}
+
+define i32 @test36(i32 %x) {
+ %cmp = icmp slt i32 %x, 0
+ %cond = select i1 %cmp, i32 60, i32 100
+ ret i32 %cond
+; CHECK: @test36
+; CHECK: ashr i32 %x, 31
+; CHECK: and i32 {{.*}}, -40
+; CHECK: add i32 {{.*}}, 100
+; CHECK: ret
+}
+
+define i32 @test37(i32 %x) {
+ %cmp = icmp sgt i32 %x, -1
+ %cond = select i1 %cmp, i32 1, i32 -1
+ ret i32 %cond
+; CHECK: @test37
+; CHECK: ashr i32 %x, 31
+; CHECK: or i32 {{.*}}, 1
+; CHECK: ret
+}
diff --git a/test/Transforms/JumpThreading/crash.ll b/test/Transforms/JumpThreading/crash.ll
index 21620be..480b4a0 100644
--- a/test/Transforms/JumpThreading/crash.ll
+++ b/test/Transforms/JumpThreading/crash.ll
@@ -341,3 +341,49 @@ if.end12: ; preds = %if.then, %lbl_51
ret void
}
+
+
+; PR7356
+define i32 @test13(i32* %P, i8* %Ptr) {
+entry:
+ indirectbr i8* %Ptr, [label %BrBlock, label %B2]
+
+B2:
+ store i32 4, i32 *%P
+ br label %BrBlock
+
+BrBlock:
+ %L = load i32* %P
+ %C = icmp eq i32 %L, 42
+ br i1 %C, label %T, label %F
+
+T:
+ ret i32 123
+F:
+ ret i32 1422
+}
+
+
+; PR7498
+define void @test14() nounwind {
+entry:
+ %cmp33 = icmp slt i8 undef, 0 ; <i1> [#uses=1]
+ %tobool = icmp eq i8 undef, 0 ; <i1> [#uses=1]
+ br i1 %tobool, label %land.end69, label %land.rhs
+
+land.rhs: ; preds = %entry
+ br label %land.end69
+
+land.end69: ; preds = %land.rhs, %entry
+ %0 = phi i1 [ undef, %land.rhs ], [ true, %entry ] ; <i1> [#uses=1]
+ %cmp71 = or i1 true, %0 ; <i1> [#uses=1]
+ %cmp73 = xor i1 %cmp33, %cmp71 ; <i1> [#uses=1]
+ br i1 %cmp73, label %if.then, label %if.end
+
+if.then: ; preds = %land.end69
+ ret void
+
+if.end: ; preds = %land.end69
+ ret void
+}
+
diff --git a/test/Transforms/LoopRotate/phi-duplicate.ll b/test/Transforms/LoopRotate/phi-duplicate.ll
index cac00f8..9a64e2a 100644
--- a/test/Transforms/LoopRotate/phi-duplicate.ll
+++ b/test/Transforms/LoopRotate/phi-duplicate.ll
@@ -30,6 +30,6 @@ for.end: ; preds = %for.cond
; Should only end up with one phi.
; CHECK: for.body:
; CHECK-NEXT: %j.02 = phi i64
-; CHECK-NOT phi
+; CHECK-NOT: phi
; CHECK: ret void
diff --git a/test/Transforms/LoopUnswitch/preserve-analyses.ll b/test/Transforms/LoopUnswitch/preserve-analyses.ll
index 3364fb2..668f8ec 100644
--- a/test/Transforms/LoopUnswitch/preserve-analyses.ll
+++ b/test/Transforms/LoopUnswitch/preserve-analyses.ll
@@ -9,7 +9,7 @@ target triple = "armv6-apple-darwin9"
@delim1 = external global i32 ; <i32*> [#uses=1]
@delim2 = external global i32 ; <i32*> [#uses=1]
-define arm_apcscc i32 @ineqn(i8* %s, i8* %p) nounwind readonly {
+define i32 @ineqn(i8* %s, i8* %p) nounwind readonly {
entry:
%0 = load i32* @delim1, align 4 ; <i32> [#uses=1]
%1 = load i32* @delim2, align 4 ; <i32> [#uses=1]
diff --git a/test/Transforms/Mem2Reg/ConvertDebugInfo.ll b/test/Transforms/Mem2Reg/ConvertDebugInfo.ll
index 37d27d4..2f1ccb4 100644
--- a/test/Transforms/Mem2Reg/ConvertDebugInfo.ll
+++ b/test/Transforms/Mem2Reg/ConvertDebugInfo.ll
@@ -9,7 +9,7 @@ entry:
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
call void @llvm.dbg.declare(metadata !{i32* %i_addr}, metadata !0), !dbg !8
; CHECK: call void @llvm.dbg.value(metadata !{i32 %i}, i64 0, metadata !0)
-; CHECK: call void @llvm.dbg.value(metadata !{double %j}, i64 0, metadata !8)
+; CHECK: call void @llvm.dbg.value(metadata !{double %j}, i64 0, metadata !9)
store i32 %i, i32* %i_addr
call void @llvm.dbg.declare(metadata !{double* %j_addr}, metadata !9), !dbg !8
store double %j, double* %j_addr
diff --git a/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll b/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll
new file mode 100644
index 0000000..4cb621f
--- /dev/null
+++ b/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll
@@ -0,0 +1,52 @@
+; RUN: opt -mem2reg < %s | llvm-dis | grep ".dbg " | count 7
+
+declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
+
+declare void @foo(i32, i64, i8*)
+
+define void @baz(i32 %a) nounwind ssp {
+entry:
+ %x_addr.i = alloca i32 ; <i32*> [#uses=2]
+ %y_addr.i = alloca i64 ; <i64*> [#uses=2]
+ %z_addr.i = alloca i8* ; <i8**> [#uses=2]
+ %a_addr = alloca i32 ; <i32*> [#uses=2]
+ %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ call void @llvm.dbg.declare(metadata !{i32* %a_addr}, metadata !0), !dbg !7
+ store i32 %a, i32* %a_addr
+ %0 = load i32* %a_addr, align 4, !dbg !8 ; <i32> [#uses=1]
+ call void @llvm.dbg.declare(metadata !{i32* %x_addr.i}, metadata !9) nounwind, !dbg !15
+ store i32 %0, i32* %x_addr.i
+ call void @llvm.dbg.declare(metadata !{i64* %y_addr.i}, metadata !16) nounwind, !dbg !15
+ store i64 55, i64* %y_addr.i
+ call void @llvm.dbg.declare(metadata !{i8** %z_addr.i}, metadata !17) nounwind, !dbg !15
+ store i8* bitcast (void (i32)* @baz to i8*), i8** %z_addr.i
+ %1 = load i32* %x_addr.i, align 4, !dbg !18 ; <i32> [#uses=1]
+ %2 = load i64* %y_addr.i, align 8, !dbg !18 ; <i64> [#uses=1]
+ %3 = load i8** %z_addr.i, align 8, !dbg !18 ; <i8*> [#uses=1]
+ call void @foo(i32 %1, i64 %2, i8* %3) nounwind, !dbg !18
+ br label %return, !dbg !19
+
+return: ; preds = %entry
+ ret void, !dbg !19
+}
+
+!0 = metadata !{i32 524545, metadata !1, metadata !"a", metadata !2, i32 8, metadata !6} ; [ DW_TAG_arg_variable ]
+!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"baz", metadata !"baz", metadata !"baz", metadata !2, i32 8, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ]
+!2 = metadata !{i32 524329, metadata !"bar.c", metadata !"/tmp/", metadata !3} ; [ DW_TAG_file_type ]
+!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"bar.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
+!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!5 = metadata !{null, metadata !6}
+!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
+!7 = metadata !{i32 8, i32 0, metadata !1, null}
+!8 = metadata !{i32 9, i32 0, metadata !1, null}
+!9 = metadata !{i32 524545, metadata !10, metadata !"x", metadata !2, i32 4, metadata !6} ; [ DW_TAG_arg_variable ]
+!10 = metadata !{i32 524334, i32 0, metadata !2, metadata !"bar", metadata !"bar", metadata !"bar", metadata !2, i32 4, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ]
+!11 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!12 = metadata !{null, metadata !6, metadata !13, metadata !14}
+!13 = metadata !{i32 524324, metadata !2, metadata !"long int", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
+!14 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ]
+!15 = metadata !{i32 4, i32 0, metadata !10, metadata !8}
+!16 = metadata !{i32 524545, metadata !10, metadata !"y", metadata !2, i32 4, metadata !13} ; [ DW_TAG_arg_variable ]
+!17 = metadata !{i32 524545, metadata !10, metadata !"z", metadata !2, i32 4, metadata !14} ; [ DW_TAG_arg_variable ]
+!18 = metadata !{i32 5, i32 0, metadata !10, metadata !8}
+!19 = metadata !{i32 10, i32 0, metadata !1, null}
diff --git a/test/Transforms/PartialSpecialize/dg.exp b/test/Transforms/PartialSpecialize/dg.exp
new file mode 100644
index 0000000..f200589
--- /dev/null
+++ b/test/Transforms/PartialSpecialize/dg.exp
@@ -0,0 +1,3 @@
+load_lib llvm.exp
+
+RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,c,cpp}]]
diff --git a/test/Transforms/PartialSpecialize/two-specializations.ll b/test/Transforms/PartialSpecialize/two-specializations.ll
new file mode 100644
index 0000000..c85ddb7
--- /dev/null
+++ b/test/Transforms/PartialSpecialize/two-specializations.ll
@@ -0,0 +1,33 @@
+; If there are two specializations of a function, make sure each callsite
+; calls the right one.
+;
+; RN: opt -S -partialspecialization %s | FileCheck %s
+; RUN: true
+declare void @callback1()
+declare void @callback2()
+
+define internal void @UseCallback(void()* %pCallback) {
+ call void %pCallback()
+ ret void
+}
+
+define void @foo(void()* %pNonConstCallback)
+{
+Entry:
+; CHECK: Entry
+; CHECK-NEXT: call void @callback1()
+; CHECK-NEXT: call void @callback1()
+; CHECK-NEXT: call void @callback2()
+; CHECK-NEXT: call void %pNonConstCallback()
+; CHECK-NEXT: call void @callback1()
+; CHECK-NEXT: call void @callback2()
+; CHECK-NEXT: call void @callback2()
+ call void @UseCallback(void()* @callback1)
+ call void @UseCallback(void()* @callback1)
+ call void @UseCallback(void()* @callback2)
+ call void @UseCallback(void()* %pNonConstCallback)
+ call void @UseCallback(void()* @callback1)
+ call void @UseCallback(void()* @callback2)
+ call void @UseCallback(void()* @callback2)
+ ret void
+}
diff --git a/test/Transforms/ScalarRepl/2009-12-11-NeonTypes.ll b/test/Transforms/ScalarRepl/2009-12-11-NeonTypes.ll
index 71f66d6..31d9bae 100644
--- a/test/Transforms/ScalarRepl/2009-12-11-NeonTypes.ll
+++ b/test/Transforms/ScalarRepl/2009-12-11-NeonTypes.ll
@@ -9,7 +9,7 @@ target triple = "thumbv7-apple-darwin10"
%struct.int16x8x2_t = type { [2 x %struct.int16x8_t] }
%union..0anon = type { %struct.int16x8x2_t }
-define arm_apcscc void @test(<8 x i16> %tmp.0, %struct.int16x8x2_t* %dst) nounwind {
+define void @test(<8 x i16> %tmp.0, %struct.int16x8x2_t* %dst) nounwind {
; CHECK: @test
; CHECK-NOT: alloca
; CHECK: "alloca point"
@@ -68,7 +68,7 @@ return: ; preds = %entry
; Radar 7466574
%struct._NSRange = type { i64 }
-define arm_apcscc void @test_memcpy_self() nounwind {
+define void @test_memcpy_self() nounwind {
; CHECK: @test_memcpy_self
; CHECK-NOT: alloca
; CHECK: br i1
diff --git a/test/Transforms/ScalarRepl/2010-01-18-SelfCopy.ll b/test/Transforms/ScalarRepl/2010-01-18-SelfCopy.ll
index 74cf251..3aee399 100644
--- a/test/Transforms/ScalarRepl/2010-01-18-SelfCopy.ll
+++ b/test/Transforms/ScalarRepl/2010-01-18-SelfCopy.ll
@@ -5,7 +5,7 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f3
%struct.test = type { [3 x double ] }
-define arm_apcscc void @test_memcpy_self() nounwind {
+define void @test_memcpy_self() nounwind {
; CHECK: @test_memcpy_self
; CHECK-NOT: alloca
; CHECK: ret void
diff --git a/test/Transforms/ScalarRepl/address-space.ll b/test/Transforms/ScalarRepl/address-space.ll
new file mode 100644
index 0000000..318d4e7
--- /dev/null
+++ b/test/Transforms/ScalarRepl/address-space.ll
@@ -0,0 +1,35 @@
+; RUN: opt -S -scalarrepl < %s | FileCheck %s
+; PR7437 - Make sure SROA preserves address space of memcpy when
+; hacking on it.
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-apple-darwin10"
+
+%struct.anon = type { [1 x float] }
+
+; CHECK: define void @Test(
+; CHECK: load float addrspace(2)*
+; CHECK-NEXT: fsub float
+; CHECK: store float {{.*}}, float addrspace(2)*
+define void @Test(%struct.anon addrspace(2)* %pPtr) nounwind {
+entry:
+ %s = alloca %struct.anon, align 4 ; <%struct.anon*> [#uses=3]
+ %arrayidx = getelementptr inbounds %struct.anon addrspace(2)* %pPtr, i64 0 ; <%struct.anon addrspace(2)*> [#uses=1]
+ %tmp1 = bitcast %struct.anon* %s to i8* ; <i8*> [#uses=1]
+ %tmp2 = bitcast %struct.anon addrspace(2)* %arrayidx to i8 addrspace(2)* ; <i8 addrspace(2)*> [#uses=1]
+ call void @llvm.memcpy.p0i8.p2i8.i64(i8* %tmp1, i8 addrspace(2)* %tmp2, i64 4, i32 4, i1 false)
+ %tmp3 = getelementptr inbounds %struct.anon* %s, i32 0, i32 0 ; <[1 x float]*> [#uses=1]
+ %arrayidx4 = getelementptr inbounds [1 x float]* %tmp3, i32 0, i64 0 ; <float*> [#uses=2]
+ %tmp5 = load float* %arrayidx4 ; <float> [#uses=1]
+ %sub = fsub float %tmp5, 5.000000e+00 ; <float> [#uses=1]
+ store float %sub, float* %arrayidx4
+ %arrayidx7 = getelementptr inbounds %struct.anon addrspace(2)* %pPtr, i64 0 ; <%struct.anon addrspace(2)*> [#uses=1]
+ %tmp8 = bitcast %struct.anon addrspace(2)* %arrayidx7 to i8 addrspace(2)* ; <i8 addrspace(2)*> [#uses=1]
+ %tmp9 = bitcast %struct.anon* %s to i8* ; <i8*> [#uses=1]
+ call void @llvm.memcpy.p2i8.p0i8.i64(i8 addrspace(2)* %tmp8, i8* %tmp9, i64 4, i32 4, i1 false)
+ ret void
+}
+
+declare void @llvm.memcpy.p0i8.p2i8.i64(i8* nocapture, i8 addrspace(2)* nocapture, i64, i32, i1) nounwind
+
+declare void @llvm.memcpy.p2i8.p0i8.i64(i8 addrspace(2)* nocapture, i8* nocapture, i64, i32, i1) nounwind
+
diff --git a/test/Transforms/ScalarRepl/memcpy-align.ll b/test/Transforms/ScalarRepl/memcpy-align.ll
index 91d354d..a7af208 100644
--- a/test/Transforms/ScalarRepl/memcpy-align.ll
+++ b/test/Transforms/ScalarRepl/memcpy-align.ll
@@ -9,7 +9,7 @@ target triple = "arm-u-u"
@c = external global %0 ; <%0*> [#uses=1]
-define arm_aapcscc void @good() nounwind {
+define void @good() nounwind {
entry:
%x0 = alloca %struct.anon, align 4 ; <%struct.anon*> [#uses=2]
%tmp = bitcast %struct.anon* %x0 to i8* ; <i8*> [#uses=1]
diff --git a/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll b/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll
index 6956faa..7bca5f5 100644
--- a/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll
+++ b/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll
@@ -31,3 +31,14 @@ entry:
; CHECK: call void @llvm.trap
; CHECK: unreachable
}
+
+; PR7369
+define void @test3() nounwind {
+entry:
+ volatile store i32 4, i32* null
+ ret void
+
+; CHECK: @test3
+; CHECK: volatile store i32 4, i32* null
+; CHECK: ret
+}
diff --git a/test/Transforms/SimplifyLibCalls/2010-05-30-memcpy-Struct.ll b/test/Transforms/SimplifyLibCalls/2010-05-30-memcpy-Struct.ll
new file mode 100644
index 0000000..f67bae7
--- /dev/null
+++ b/test/Transforms/SimplifyLibCalls/2010-05-30-memcpy-Struct.ll
@@ -0,0 +1,20 @@
+; RUN: opt -simplify-libcalls %s -S -o - | FileCheck %s
+; PR7265
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-unknown-linux-gnu"
+
+%union.anon = type { i32, [4 x i8] }
+
+@.str = private constant [3 x i8] c"%s\00" ; <[3 x i8]*> [#uses=2]
+
+define void @CopyEventArg(%union.anon* %ev) nounwind {
+entry:
+ %call = call i32 (i8*, i8*, ...)* @sprintf(i8* undef, i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), %union.anon* %ev) nounwind ; <i32> [#uses=0]
+; CHECK: bitcast %union.anon* %ev to i8*
+; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+ ret void
+}
+
+declare i32 @sprintf(i8*, i8*, ...)
+
diff --git a/test/Transforms/SimplifyLibCalls/PR7357.ll b/test/Transforms/SimplifyLibCalls/PR7357.ll
new file mode 100644
index 0000000..6d5c1d5
--- /dev/null
+++ b/test/Transforms/SimplifyLibCalls/PR7357.ll
@@ -0,0 +1,16 @@
+; RUN: opt < %s -default-data-layout="e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32" -simplify-libcalls -S | FileCheck %s
+@.str1 = private constant [11 x i8] c"(){};[]&|:\00", align 4
+
+; check that simplify libcalls will not replace a call with one calling
+; convention with a new call with a different calling convention.
+
+; CHECK: define arm_aapcscc i32 @foo(i32 %argc)
+; CHECK: call arm_aapcscc i8* @strchr
+define arm_aapcscc i32 @foo(i32 %argc) nounwind {
+bb.nph:
+ call arm_aapcscc i8* @strchr(i8* getelementptr ([11 x i8]* @.str1, i32 0,
+i32 0), i32 %argc) nounwind readonly
+ ret i32 0
+}
+
+declare arm_aapcscc i8* @strchr(i8*, i32) nounwind readonly
diff --git a/test/Transforms/SimplifyLibCalls/StrNCmp.ll b/test/Transforms/SimplifyLibCalls/StrNCmp.ll
index ba77385..8b536a5 100644
--- a/test/Transforms/SimplifyLibCalls/StrNCmp.ll
+++ b/test/Transforms/SimplifyLibCalls/StrNCmp.ll
@@ -2,6 +2,9 @@
; RUN: opt < %s -simplify-libcalls -S | \
; RUN: not grep {call.*strncmp}
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
+target triple = "i386-apple-darwin9.0"
+
@hello = constant [6 x i8] c"hello\00" ; <[6 x i8]*> [#uses=1]
@hell = constant [5 x i8] c"hell\00" ; <[5 x i8]*> [#uses=1]
@null = constant [1 x i8] zeroinitializer ; <[1 x i8]*> [#uses=1]
@@ -26,3 +29,7 @@ define i32 @main() {
ret i32 %rslt4
}
+define i32 @test1(i8* %P, i8* %Q) {
+ %cmp = call i32 @strncmp(i8* %P, i8* %Q, i32 1)
+ ret i32 %cmp
+}
diff --git a/test/Transforms/SimplifyLibCalls/StrStr.ll b/test/Transforms/SimplifyLibCalls/StrStr.ll
index 2cac2d4..eefd2e8 100644
--- a/test/Transforms/SimplifyLibCalls/StrStr.ll
+++ b/test/Transforms/SimplifyLibCalls/StrStr.ll
@@ -46,3 +46,15 @@ entry:
; CHECK: @test4
; CHECK: ret i8* %P
}
+
+define i1 @test5(i8* %P, i8* %Q) nounwind readonly {
+entry:
+ %call = tail call i8* @strstr(i8* %P, i8* %Q) nounwind ; <i8*> [#uses=1]
+ %cmp = icmp eq i8* %call, %P
+ ret i1 %cmp
+; CHECK: @test5
+; CHECK: [[LEN:%[a-z]+]] = call {{i[0-9]+}} @strlen(i8* %Q)
+; CHECK: [[NCMP:%[a-z]+]] = call {{i[0-9]+}} @strncmp(i8* %P, i8* %Q, {{i[0-9]+}} [[LEN]])
+; CHECK: icmp eq {{i[0-9]+}} [[NCMP]], 0
+; CHECK: ret i1
+}
diff --git a/test/Transforms/StripSymbols/2010-06-30-StripDebug.ll b/test/Transforms/StripSymbols/2010-06-30-StripDebug.ll
new file mode 100644
index 0000000..f5899d2
--- /dev/null
+++ b/test/Transforms/StripSymbols/2010-06-30-StripDebug.ll
@@ -0,0 +1,28 @@
+; RUN: opt -strip-debug < %s | llvm-dis | grep -v llvm.dbg
+
+@x = common global i32 0 ; <i32*> [#uses=0]
+
+define void @foo() nounwind readnone optsize ssp {
+entry:
+ tail call void @llvm.dbg.value(metadata !9, i64 0, metadata !5), !dbg !10
+ ret void, !dbg !11
+}
+
+declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone
+
+!llvm.dbg.sp = !{!0}
+!llvm.dbg.lv.foo = !{!5}
+!llvm.dbg.gv = !{!8}
+
+!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, void ()* @foo} ; [ DW_TAG_subprogram ]
+!1 = metadata !{i32 524329, metadata !"b.c", metadata !"/tmp", metadata !2} ; [ DW_TAG_file_type ]
+!2 = metadata !{i32 524305, i32 0, i32 1, metadata !"b.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
+!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!4 = metadata !{null}
+!5 = metadata !{i32 524544, metadata !6, metadata !"y", metadata !1, i32 3, metadata !7} ; [ DW_TAG_auto_variable ]
+!6 = metadata !{i32 524299, metadata !0, i32 2, i32 0} ; [ DW_TAG_lexical_block ]
+!7 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
+!8 = metadata !{i32 524340, i32 0, metadata !1, metadata !"x", metadata !"x", metadata !"", metadata !1, i32 1, metadata !7, i1 false, i1 true, i32* @x} ; [ DW_TAG_variable ]
+!9 = metadata !{i32 0}
+!10 = metadata !{i32 3, i32 0, metadata !6, null}
+!11 = metadata !{i32 4, i32 0, metadata !6, null}
diff --git a/test/Transforms/StripSymbols/2010-07-01-DeadDbgInfo.ll b/test/Transforms/StripSymbols/2010-07-01-DeadDbgInfo.ll
new file mode 100644
index 0000000..1df0351
--- /dev/null
+++ b/test/Transforms/StripSymbols/2010-07-01-DeadDbgInfo.ll
@@ -0,0 +1,47 @@
+; RUN: opt -strip-dead-debug-info < %s | llvm-dis -o %t.ll
+; RUN: grep -v bar %t.ll
+; RUN: grep -v abcd %t.ll
+
+@xyz = global i32 2 ; <i32*> [#uses=1]
+
+declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone
+
+define i32 @fn() nounwind readnone ssp {
+entry:
+ ret i32 0, !dbg !17
+}
+
+define i32 @foo(i32 %i) nounwind readonly ssp {
+entry:
+ tail call void @llvm.dbg.value(metadata !{i32 %i}, i64 0, metadata !14), !dbg !19
+ %.0 = load i32* @xyz, align 4 ; <i32> [#uses=1]
+ ret i32 %.0, !dbg !20
+}
+
+!llvm.dbg.sp = !{!0, !5, !9}
+!llvm.dbg.lv.bar = !{!12}
+!llvm.dbg.lv.foo = !{!14}
+!llvm.dbg.gv = !{!15, !16}
+
+!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"bar", metadata !"bar", metadata !"", metadata !1, i32 5, metadata !3, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 true, null} ; [ DW_TAG_subprogram ]
+!1 = metadata !{i32 524329, metadata !"g.c", metadata !"/tmp/", metadata !2} ; [ DW_TAG_file_type ]
+!2 = metadata !{i32 524305, i32 0, i32 1, metadata !"g.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
+!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!4 = metadata !{null}
+!5 = metadata !{i32 524334, i32 0, metadata !1, metadata !"fn", metadata !"fn", metadata !"fn", metadata !1, i32 6, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 ()* @fn} ; [ DW_TAG_subprogram ]
+!6 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!7 = metadata !{metadata !8}
+!8 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
+!9 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 7, metadata !10, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 (i32)* @foo} ; [ DW_TAG_subprogram ]
+!10 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!11 = metadata !{metadata !8, metadata !8}
+!12 = metadata !{i32 524544, metadata !13, metadata !"bb", metadata !1, i32 5, metadata !8} ; [ DW_TAG_auto_variable ]
+!13 = metadata !{i32 524299, metadata !0, i32 5, i32 0} ; [ DW_TAG_lexical_block ]
+!14 = metadata !{i32 524545, metadata !9, metadata !"i", metadata !1, i32 7, metadata !8} ; [ DW_TAG_arg_variable ]
+!15 = metadata !{i32 524340, i32 0, metadata !1, metadata !"abcd", metadata !"abcd", metadata !"", metadata !1, i32 2, metadata !8, i1 true, i1 true, null} ; [ DW_TAG_variable ]
+!16 = metadata !{i32 524340, i32 0, metadata !1, metadata !"xyz", metadata !"xyz", metadata !"", metadata !1, i32 3, metadata !8, i1 false, i1 true, i32* @xyz} ; [ DW_TAG_variable ]
+!17 = metadata !{i32 6, i32 0, metadata !18, null}
+!18 = metadata !{i32 524299, metadata !5, i32 6, i32 0} ; [ DW_TAG_lexical_block ]
+!19 = metadata !{i32 7, i32 0, metadata !9, null}
+!20 = metadata !{i32 10, i32 0, metadata !21, null}
+!21 = metadata !{i32 524299, metadata !9, i32 7, i32 0} ; [ DW_TAG_lexical_block ]
diff --git a/test/Transforms/TailCallElim/2010-06-26-MultipleReturnValues.ll b/test/Transforms/TailCallElim/2010-06-26-MultipleReturnValues.ll
new file mode 100644
index 0000000..0626592
--- /dev/null
+++ b/test/Transforms/TailCallElim/2010-06-26-MultipleReturnValues.ll
@@ -0,0 +1,20 @@
+; RUN: opt < %s -tailcallelim -S | FileCheck %s
+; PR7328
+; PR7506
+define i32 @foo(i32 %x) {
+; CHECK: define i32 @foo
+; CHECK: %accumulator.tr = phi i32 [ 1, %entry ], [ 0, %body ]
+entry:
+ %cond = icmp ugt i32 %x, 0 ; <i1> [#uses=1]
+ br i1 %cond, label %return, label %body
+
+body: ; preds = %entry
+ %y = add i32 %x, 1 ; <i32> [#uses=1]
+ %tmp = call i32 @foo(i32 %y) ; <i32> [#uses=0]
+; CHECK-NOT: call
+ ret i32 0
+; CHECK: ret i32 %accumulator.tr
+
+return: ; preds = %entry
+ ret i32 1
+}
OpenPOWER on IntegriCloud