diff options
Diffstat (limited to 'test/Transforms/Mem2Reg/pr24179.ll')
| -rw-r--r-- | test/Transforms/Mem2Reg/pr24179.ll | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/test/Transforms/Mem2Reg/pr24179.ll b/test/Transforms/Mem2Reg/pr24179.ll new file mode 100644 index 0000000000000..e4216ce4daa17 --- /dev/null +++ b/test/Transforms/Mem2Reg/pr24179.ll @@ -0,0 +1,44 @@ +; RUN: opt -mem2reg < %s -S | FileCheck %s + +declare i32 @def(i32) +declare i1 @use(i32) + +; Special case of a single-BB alloca does not apply here since the load +; is affected by the following store. Expect this case to be identified +; and a PHI node to be created. +define void @test1() { +; CHECK-LABEL: @test1( + entry: + %t = alloca i32 + br label %loop + + loop: + %v = load i32, i32* %t + %c = call i1 @use(i32 %v) +; CHECK: [[PHI:%.*]] = phi i32 [ undef, %entry ], [ %n, %loop ] +; CHECK: call i1 @use(i32 [[PHI]]) + %n = call i32 @def(i32 7) + store i32 %n, i32* %t + br i1 %c, label %loop, label %exit + + exit: + ret void +} + +; Same as above, except there is no following store. The alloca should just be +; replaced with an undef +define void @test2() { +; CHECK-LABEL: @test2( + entry: + %t = alloca i32 + br label %loop + + loop: + %v = load i32, i32* %t + %c = call i1 @use(i32 %v) +; CHECK: %c = call i1 @use(i32 undef) + br i1 %c, label %loop, label %exit + + exit: + ret void +} |
