xref: /llvm-project/llvm/test/Transforms/InstSimplify/phi-cse.ll (revision 04b944e23050e4e0c6ee983cc9bc17740315ea4f)
194d3dd8bSRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2b280ee1dSBjorn Pettersson; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
394d3dd8bSRoman Lebedev
4aea042e9SRoman Lebedev; All these are negative cases, we are not allowed to perform this
5aea042e9SRoman Lebedev; simplification in InstSimplify, because the PHI's aren't def-reachable
6aea042e9SRoman Lebedev; from one another.
7aea042e9SRoman Lebedev
894d3dd8bSRoman Lebedev; Most basic case, fully identical PHI nodes
9*04b944e2SNikita Popovdefine void @test0(i32 %v0, i32 %v1, i1 %c, ptr %d0, ptr %d1) {
1094d3dd8bSRoman Lebedev; CHECK-LABEL: @test0(
1194d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
1294d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
1394d3dd8bSRoman Lebedev; CHECK:       b0:
1494d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
1594d3dd8bSRoman Lebedev; CHECK:       b1:
1694d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
1794d3dd8bSRoman Lebedev; CHECK:       end:
1894d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
19ed90f15eSOwen Anderson; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V0]], [[B0]] ], [ [[V1]], [[B1]] ]
20*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
21*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
2294d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
2394d3dd8bSRoman Lebedev;
2494d3dd8bSRoman Lebedeventry:
2594d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
2694d3dd8bSRoman Lebedev
2794d3dd8bSRoman Lebedevb0:
2894d3dd8bSRoman Lebedev  br label %end
2994d3dd8bSRoman Lebedev
3094d3dd8bSRoman Lebedevb1:
3194d3dd8bSRoman Lebedev  br label %end
3294d3dd8bSRoman Lebedev
3394d3dd8bSRoman Lebedevend:
3494d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
3594d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
36*04b944e2SNikita Popov  store i32 %i0, ptr %d0
37*04b944e2SNikita Popov  store i32 %i1, ptr %d1
3894d3dd8bSRoman Lebedev  ret void
3994d3dd8bSRoman Lebedev}
4094d3dd8bSRoman Lebedev
4194d3dd8bSRoman Lebedev; Fully identical PHI nodes, but order of operands differs
42*04b944e2SNikita Popovdefine void @test1(i32 %v0, i32 %v1, i1 %c, ptr %d0, ptr %d1) {
4394d3dd8bSRoman Lebedev; CHECK-LABEL: @test1(
4494d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
4594d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
4694d3dd8bSRoman Lebedev; CHECK:       b0:
4794d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
4894d3dd8bSRoman Lebedev; CHECK:       b1:
4994d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
5094d3dd8bSRoman Lebedev; CHECK:       end:
5194d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
52ed90f15eSOwen Anderson; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V1]], [[B1]] ], [ [[V0]], [[B0]] ]
53*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
54*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
5594d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
5694d3dd8bSRoman Lebedev;
5794d3dd8bSRoman Lebedeventry:
5894d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
5994d3dd8bSRoman Lebedev
6094d3dd8bSRoman Lebedevb0:
6194d3dd8bSRoman Lebedev  br label %end
6294d3dd8bSRoman Lebedev
6394d3dd8bSRoman Lebedevb1:
6494d3dd8bSRoman Lebedev  br label %end
6594d3dd8bSRoman Lebedev
6694d3dd8bSRoman Lebedevend:
6794d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
6894d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v1, %b1 ], [ %v0, %b0 ]
69*04b944e2SNikita Popov  store i32 %i0, ptr %d0
70*04b944e2SNikita Popov  store i32 %i1, ptr %d1
7194d3dd8bSRoman Lebedev  ret void
7294d3dd8bSRoman Lebedev}
7394d3dd8bSRoman Lebedev
7494d3dd8bSRoman Lebedev; Different incoming values in second PHI
75*04b944e2SNikita Popovdefine void @negative_test2(i32 %v0, i32 %v1, i32 %v2, i1 %c, ptr %d0, ptr %d1) {
7694d3dd8bSRoman Lebedev; CHECK-LABEL: @negative_test2(
7794d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
7894d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
7994d3dd8bSRoman Lebedev; CHECK:       b0:
8094d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
8194d3dd8bSRoman Lebedev; CHECK:       b1:
8294d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
8394d3dd8bSRoman Lebedev; CHECK:       end:
8494d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
8594d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V0]], [[B0]] ], [ [[V2:%.*]], [[B1]] ]
86*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
87*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
8894d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
8994d3dd8bSRoman Lebedev;
9094d3dd8bSRoman Lebedeventry:
9194d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
9294d3dd8bSRoman Lebedev
9394d3dd8bSRoman Lebedevb0:
9494d3dd8bSRoman Lebedev  br label %end
9594d3dd8bSRoman Lebedev
9694d3dd8bSRoman Lebedevb1:
9794d3dd8bSRoman Lebedev  br label %end
9894d3dd8bSRoman Lebedev
9994d3dd8bSRoman Lebedevend:
10094d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
10194d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v0, %b0 ], [ %v2, %b1 ] ; from %b0 takes %v2 instead of %v1
102*04b944e2SNikita Popov  store i32 %i0, ptr %d0
103*04b944e2SNikita Popov  store i32 %i1, ptr %d1
10494d3dd8bSRoman Lebedev  ret void
10594d3dd8bSRoman Lebedev}
106*04b944e2SNikita Popovdefine void @negative_test3(i32 %v0, i32 %v1, i32 %v2, i1 %c, ptr %d0, ptr %d1) {
10794d3dd8bSRoman Lebedev; CHECK-LABEL: @negative_test3(
10894d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
10994d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
11094d3dd8bSRoman Lebedev; CHECK:       b0:
11194d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
11294d3dd8bSRoman Lebedev; CHECK:       b1:
11394d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
11494d3dd8bSRoman Lebedev; CHECK:       end:
11594d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
11694d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V2:%.*]], [[B1]] ], [ [[V0]], [[B0]] ]
117*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
118*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
11994d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
12094d3dd8bSRoman Lebedev;
12194d3dd8bSRoman Lebedeventry:
12294d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
12394d3dd8bSRoman Lebedev
12494d3dd8bSRoman Lebedevb0:
12594d3dd8bSRoman Lebedev  br label %end
12694d3dd8bSRoman Lebedev
12794d3dd8bSRoman Lebedevb1:
12894d3dd8bSRoman Lebedev  br label %end
12994d3dd8bSRoman Lebedev
13094d3dd8bSRoman Lebedevend:
13194d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
13294d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v2, %b1 ], [ %v0, %b0 ] ; from %b0 takes %v2 instead of %v1
133*04b944e2SNikita Popov  store i32 %i0, ptr %d0
134*04b944e2SNikita Popov  store i32 %i1, ptr %d1
13594d3dd8bSRoman Lebedev  ret void
13694d3dd8bSRoman Lebedev}
137*04b944e2SNikita Popovdefine void @negative_test4(i32 %v0, i32 %v1, i1 %c, ptr %d0, ptr %d1) {
13894d3dd8bSRoman Lebedev; CHECK-LABEL: @negative_test4(
13994d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
14094d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
14194d3dd8bSRoman Lebedev; CHECK:       b0:
14294d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
14394d3dd8bSRoman Lebedev; CHECK:       b1:
14494d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
14594d3dd8bSRoman Lebedev; CHECK:       end:
14694d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
147ed90f15eSOwen Anderson; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V1]], [[B1]] ], [ [[V0]], [[B0]] ]
148*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
149*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
15094d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
15194d3dd8bSRoman Lebedev;
15294d3dd8bSRoman Lebedeventry:
15394d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
15494d3dd8bSRoman Lebedev
15594d3dd8bSRoman Lebedevb0:
15694d3dd8bSRoman Lebedev  br label %end
15794d3dd8bSRoman Lebedev
15894d3dd8bSRoman Lebedevb1:
15994d3dd8bSRoman Lebedev  br label %end
16094d3dd8bSRoman Lebedev
16194d3dd8bSRoman Lebedevend:
16294d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
16394d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v1, %b1 ], [ %v0, %b0 ] ; incoming values are swapped
164*04b944e2SNikita Popov  store i32 %i0, ptr %d0
165*04b944e2SNikita Popov  store i32 %i1, ptr %d1
16694d3dd8bSRoman Lebedev  ret void
16794d3dd8bSRoman Lebedev}
16894d3dd8bSRoman Lebedev
16994d3dd8bSRoman Lebedev; Both PHI's are identical, but the first one has no uses, so ignore it.
170*04b944e2SNikita Popovdefine void @test5(i32 %v0, i32 %v1, i1 %c, ptr %d0, ptr %d1) {
17194d3dd8bSRoman Lebedev; CHECK-LABEL: @test5(
17294d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
17394d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
17494d3dd8bSRoman Lebedev; CHECK:       b0:
17594d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
17694d3dd8bSRoman Lebedev; CHECK:       b1:
17794d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
17894d3dd8bSRoman Lebedev; CHECK:       end:
17994d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
180*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
18194d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
18294d3dd8bSRoman Lebedev;
18394d3dd8bSRoman Lebedeventry:
18494d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
18594d3dd8bSRoman Lebedev
18694d3dd8bSRoman Lebedevb0:
18794d3dd8bSRoman Lebedev  br label %end
18894d3dd8bSRoman Lebedev
18994d3dd8bSRoman Lebedevb1:
19094d3dd8bSRoman Lebedev  br label %end
19194d3dd8bSRoman Lebedev
19294d3dd8bSRoman Lebedevend:
19394d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ] ; unused
19494d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
195*04b944e2SNikita Popov  store i32 %i1, ptr %d1
19694d3dd8bSRoman Lebedev  ret void
19794d3dd8bSRoman Lebedev}
19894d3dd8bSRoman Lebedev; Second PHI has no uses
199*04b944e2SNikita Popovdefine void @test6(i32 %v0, i32 %v1, i1 %c, ptr %d0, ptr %d1) {
20094d3dd8bSRoman Lebedev; CHECK-LABEL: @test6(
20194d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
20294d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
20394d3dd8bSRoman Lebedev; CHECK:       b0:
20494d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
20594d3dd8bSRoman Lebedev; CHECK:       b1:
20694d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
20794d3dd8bSRoman Lebedev; CHECK:       end:
20894d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
209*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
21094d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
21194d3dd8bSRoman Lebedev;
21294d3dd8bSRoman Lebedeventry:
21394d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
21494d3dd8bSRoman Lebedev
21594d3dd8bSRoman Lebedevb0:
21694d3dd8bSRoman Lebedev  br label %end
21794d3dd8bSRoman Lebedev
21894d3dd8bSRoman Lebedevb1:
21994d3dd8bSRoman Lebedev  br label %end
22094d3dd8bSRoman Lebedev
22194d3dd8bSRoman Lebedevend:
22294d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
22394d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ] ; unused
224*04b944e2SNikita Popov  store i32 %i0, ptr %d0
22594d3dd8bSRoman Lebedev  ret void
22694d3dd8bSRoman Lebedev}
22794d3dd8bSRoman Lebedev
22894d3dd8bSRoman Lebedev; Non-matching PHI node should be ignored without terminating CSE.
229*04b944e2SNikita Popovdefine void @test7(i32 %v0, i32 %v1, i16 %v2, i16 %v3, i1 %c, ptr %d0, ptr %d1, ptr %d2) {
23094d3dd8bSRoman Lebedev; CHECK-LABEL: @test7(
23194d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
23294d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
23394d3dd8bSRoman Lebedev; CHECK:       b0:
23494d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
23594d3dd8bSRoman Lebedev; CHECK:       b1:
23694d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
23794d3dd8bSRoman Lebedev; CHECK:       end:
23894d3dd8bSRoman Lebedev; CHECK-NEXT:    [[IBAD:%.*]] = phi i16 [ [[V2:%.*]], [[B0]] ], [ [[V3:%.*]], [[B1]] ]
23994d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
240ed90f15eSOwen Anderson; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V0]], [[B0]] ], [ [[V1]], [[B1]] ]
241*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
242*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
243*04b944e2SNikita Popov; CHECK-NEXT:    store i16 [[IBAD]], ptr [[D2:%.*]], align 2
24494d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
24594d3dd8bSRoman Lebedev;
24694d3dd8bSRoman Lebedeventry:
24794d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
24894d3dd8bSRoman Lebedev
24994d3dd8bSRoman Lebedevb0:
25094d3dd8bSRoman Lebedev  br label %end
25194d3dd8bSRoman Lebedev
25294d3dd8bSRoman Lebedevb1:
25394d3dd8bSRoman Lebedev  br label %end
25494d3dd8bSRoman Lebedev
25594d3dd8bSRoman Lebedevend:
25694d3dd8bSRoman Lebedev  %iBAD = phi i16 [ %v2, %b0 ], [ %v3, %b1 ]
25794d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
25894d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
259*04b944e2SNikita Popov  store i32 %i0, ptr %d0
260*04b944e2SNikita Popov  store i32 %i1, ptr %d1
261*04b944e2SNikita Popov  store i16 %iBAD, ptr %d2
26294d3dd8bSRoman Lebedev  ret void
26394d3dd8bSRoman Lebedev}
264*04b944e2SNikita Popovdefine void @test8(i32 %v0, i32 %v1, i16 %v2, i16 %v3, i1 %c, ptr %d0, ptr %d1, ptr %d2) {
26594d3dd8bSRoman Lebedev; CHECK-LABEL: @test8(
26694d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
26794d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
26894d3dd8bSRoman Lebedev; CHECK:       b0:
26994d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
27094d3dd8bSRoman Lebedev; CHECK:       b1:
27194d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
27294d3dd8bSRoman Lebedev; CHECK:       end:
27394d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
27494d3dd8bSRoman Lebedev; CHECK-NEXT:    [[IBAD:%.*]] = phi i16 [ [[V2:%.*]], [[B0]] ], [ [[V3:%.*]], [[B1]] ]
275ed90f15eSOwen Anderson; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V0]], [[B0]] ], [ [[V1]], [[B1]] ]
276*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
277*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
278*04b944e2SNikita Popov; CHECK-NEXT:    store i16 [[IBAD]], ptr [[D2:%.*]], align 2
27994d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
28094d3dd8bSRoman Lebedev;
28194d3dd8bSRoman Lebedeventry:
28294d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
28394d3dd8bSRoman Lebedev
28494d3dd8bSRoman Lebedevb0:
28594d3dd8bSRoman Lebedev  br label %end
28694d3dd8bSRoman Lebedev
28794d3dd8bSRoman Lebedevb1:
28894d3dd8bSRoman Lebedev  br label %end
28994d3dd8bSRoman Lebedev
29094d3dd8bSRoman Lebedevend:
29194d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
29294d3dd8bSRoman Lebedev  %iBAD = phi i16 [ %v2, %b0 ], [ %v3, %b1 ]
29394d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
294*04b944e2SNikita Popov  store i32 %i0, ptr %d0
295*04b944e2SNikita Popov  store i32 %i1, ptr %d1
296*04b944e2SNikita Popov  store i16 %iBAD, ptr %d2
29794d3dd8bSRoman Lebedev  ret void
29894d3dd8bSRoman Lebedev}
299*04b944e2SNikita Popovdefine void @test9(i32 %v0, i32 %v1, i16 %v2, i16 %v3, i1 %c, ptr %d0, ptr %d1, ptr %d2) {
30094d3dd8bSRoman Lebedev; CHECK-LABEL: @test9(
30194d3dd8bSRoman Lebedev; CHECK-NEXT:  entry:
30294d3dd8bSRoman Lebedev; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
30394d3dd8bSRoman Lebedev; CHECK:       b0:
30494d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END:%.*]]
30594d3dd8bSRoman Lebedev; CHECK:       b1:
30694d3dd8bSRoman Lebedev; CHECK-NEXT:    br label [[END]]
30794d3dd8bSRoman Lebedev; CHECK:       end:
30894d3dd8bSRoman Lebedev; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ [[V0:%.*]], [[B0]] ], [ [[V1:%.*]], [[B1]] ]
309ed90f15eSOwen Anderson; CHECK-NEXT:    [[I1:%.*]] = phi i32 [ [[V0]], [[B0]] ], [ [[V1]], [[B1]] ]
31094d3dd8bSRoman Lebedev; CHECK-NEXT:    [[IBAD:%.*]] = phi i16 [ [[V2:%.*]], [[B0]] ], [ [[V3:%.*]], [[B1]] ]
311*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I0]], ptr [[D0:%.*]], align 4
312*04b944e2SNikita Popov; CHECK-NEXT:    store i32 [[I1]], ptr [[D1:%.*]], align 4
313*04b944e2SNikita Popov; CHECK-NEXT:    store i16 [[IBAD]], ptr [[D2:%.*]], align 2
31494d3dd8bSRoman Lebedev; CHECK-NEXT:    ret void
31594d3dd8bSRoman Lebedev;
31694d3dd8bSRoman Lebedeventry:
31794d3dd8bSRoman Lebedev  br i1 %c, label %b0, label %b1
31894d3dd8bSRoman Lebedev
31994d3dd8bSRoman Lebedevb0:
32094d3dd8bSRoman Lebedev  br label %end
32194d3dd8bSRoman Lebedev
32294d3dd8bSRoman Lebedevb1:
32394d3dd8bSRoman Lebedev  br label %end
32494d3dd8bSRoman Lebedev
32594d3dd8bSRoman Lebedevend:
32694d3dd8bSRoman Lebedev  %i0 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
32794d3dd8bSRoman Lebedev  %i1 = phi i32 [ %v0, %b0 ], [ %v1, %b1 ]
32894d3dd8bSRoman Lebedev  %iBAD = phi i16 [ %v2, %b0 ], [ %v3, %b1 ]
329*04b944e2SNikita Popov  store i32 %i0, ptr %d0
330*04b944e2SNikita Popov  store i32 %i1, ptr %d1
331*04b944e2SNikita Popov  store i16 %iBAD, ptr %d2
33294d3dd8bSRoman Lebedev  ret void
33394d3dd8bSRoman Lebedev}
334