| ; RUN: opt -mem2reg < %s -S | FileCheck %s |
| ; RUN: opt -passes=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 |
| } |