xref: /aosp_15_r20/external/llvm/test/Transforms/Mem2Reg/pr24179.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -mem2reg < %s -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -passes=mem2reg < %s -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare i32 @def(i32)
5*9880d681SAndroid Build Coastguard Workerdeclare i1 @use(i32)
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; Special case of a single-BB alloca does not apply here since the load
8*9880d681SAndroid Build Coastguard Worker; is affected by the following store. Expect this case to be identified
9*9880d681SAndroid Build Coastguard Worker; and a PHI node to be created.
10*9880d681SAndroid Build Coastguard Workerdefine void @test1() {
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
12*9880d681SAndroid Build Coastguard Worker entry:
13*9880d681SAndroid Build Coastguard Worker  %t = alloca i32
14*9880d681SAndroid Build Coastguard Worker  br label %loop
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker loop:
17*9880d681SAndroid Build Coastguard Worker  %v = load i32, i32* %t
18*9880d681SAndroid Build Coastguard Worker  %c = call i1 @use(i32 %v)
19*9880d681SAndroid Build Coastguard Worker; CHECK: [[PHI:%.*]] = phi i32 [ undef, %entry ], [ %n, %loop ]
20*9880d681SAndroid Build Coastguard Worker; CHECK: call i1 @use(i32 [[PHI]])
21*9880d681SAndroid Build Coastguard Worker  %n = call i32 @def(i32 7)
22*9880d681SAndroid Build Coastguard Worker  store i32 %n, i32* %t
23*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %loop, label %exit
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker exit:
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; Same as above, except there is no following store. The alloca should just be
30*9880d681SAndroid Build Coastguard Worker; replaced with an undef
31*9880d681SAndroid Build Coastguard Workerdefine void @test2() {
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
33*9880d681SAndroid Build Coastguard Worker entry:
34*9880d681SAndroid Build Coastguard Worker  %t = alloca i32
35*9880d681SAndroid Build Coastguard Worker  br label %loop
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker loop:
38*9880d681SAndroid Build Coastguard Worker  %v = load i32, i32* %t
39*9880d681SAndroid Build Coastguard Worker  %c = call i1 @use(i32 %v)
40*9880d681SAndroid Build Coastguard Worker; CHECK: %c = call i1 @use(i32 undef)
41*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %loop, label %exit
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker exit:
44*9880d681SAndroid Build Coastguard Worker  ret void
45*9880d681SAndroid Build Coastguard Worker}
46