; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; 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( ; CHECK-NEXT: entry: ; CHECK-NEXT: br label [[LOOP:%.*]] ; CHECK: loop: ; CHECK-NEXT: [[T_0:%.*]] = phi i32 [ undef, [[ENTRY:%.*]] ], [ [[N:%.*]], [[LOOP]] ] ; CHECK-NEXT: [[C:%.*]] = call i1 @use(i32 [[T_0]]) ; CHECK-NEXT: [[N]] = call i32 @def(i32 7) ; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]] ; CHECK: exit: ; CHECK-NEXT: ret void ; entry: %t = alloca i32 br label %loop loop: %v = load i32, i32* %t %c = call i1 @use(i32 %v) %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( ; CHECK-NEXT: entry: ; CHECK-NEXT: br label [[LOOP:%.*]] ; CHECK: loop: ; CHECK-NEXT: [[C:%.*]] = call i1 @use(i32 undef) ; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]] ; CHECK: exit: ; CHECK-NEXT: ret void ; entry: %t = alloca i32 br label %loop loop: %v = load i32, i32* %t %c = call i1 @use(i32 %v) br i1 %c, label %loop, label %exit exit: ret void }