xref: /llvm-project/llvm/test/Transforms/StructurizeCFG/loop-break-phi.ll (revision 54d31bde324523d946fd87f5c5d5e271826209d6)
19c51e518SRuiling, Song; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
29c51e518SRuiling, Song; RUN: opt -S -passes='structurizecfg' %s -o - | FileCheck %s
39c51e518SRuiling, Song
49c51e518SRuiling, Songdefine float @while_break(i32 %z, float %v, i32 %x, i32 %y) #0 {
59c51e518SRuiling, Song; CHECK-LABEL: define float @while_break(
69c51e518SRuiling, Song; CHECK-SAME: i32 [[Z:%.*]], float [[V:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR0:[0-9]+]] {
79c51e518SRuiling, Song; CHECK-NEXT:  [[ENTRY:.*]]:
89c51e518SRuiling, Song; CHECK-NEXT:    br label %[[HEADER:.*]]
99c51e518SRuiling, Song; CHECK:       [[HEADER]]:
10*54d31bdeSRuiling, Song; CHECK-NEXT:    [[V_1:%.*]] = phi float [ [[V]], %[[ENTRY]] ], [ [[TMP8:%.*]], %[[FLOW2:.*]] ]
11*54d31bdeSRuiling, Song; CHECK-NEXT:    [[IND:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[TMP5:%.*]], %[[FLOW2]] ]
129c51e518SRuiling, Song; CHECK-NEXT:    [[CC:%.*]] = icmp sge i32 [[IND]], [[X]]
139c51e518SRuiling, Song; CHECK-NEXT:    br i1 [[CC]], label %[[ELSE:.*]], label %[[FLOW:.*]]
149c51e518SRuiling, Song; CHECK:       [[FLOW]]:
159c51e518SRuiling, Song; CHECK-NEXT:    [[TMP0:%.*]] = phi float [ [[V_1]], %[[ELSE]] ], [ undef, %[[HEADER]] ]
169c51e518SRuiling, Song; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ [[CC2:%.*]], %[[ELSE]] ], [ false, %[[HEADER]] ]
179c51e518SRuiling, Song; CHECK-NEXT:    [[TMP2:%.*]] = phi i1 [ false, %[[ELSE]] ], [ true, %[[HEADER]] ]
189c51e518SRuiling, Song; CHECK-NEXT:    br i1 [[TMP2]], label %[[IF:.*]], label %[[FLOW1:.*]]
199c51e518SRuiling, Song; CHECK:       [[IF]]:
209c51e518SRuiling, Song; CHECK-NEXT:    [[V_IF:%.*]] = fadd float [[V_1]], 1.000000e+00
219c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW1]]
229c51e518SRuiling, Song; CHECK:       [[ELSE]]:
239c51e518SRuiling, Song; CHECK-NEXT:    [[CC2]] = icmp slt i32 [[IND]], [[Y]]
249c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW]]
259c51e518SRuiling, Song; CHECK:       [[FLOW1]]:
26*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP8]] = phi float [ [[V_IF]], %[[IF]] ], [ [[TMP0]], %[[FLOW]] ]
27*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP4:%.*]] = phi i1 [ true, %[[IF]] ], [ [[TMP1]], %[[FLOW]] ]
28*54d31bdeSRuiling, Song; CHECK-NEXT:    br i1 [[TMP4]], label %[[LATCH:.*]], label %[[FLOW2]]
299c51e518SRuiling, Song; CHECK:       [[LATCH]]:
309c51e518SRuiling, Song; CHECK-NEXT:    [[IND_INC:%.*]] = add i32 [[IND]], 1
319c51e518SRuiling, Song; CHECK-NEXT:    [[CC3:%.*]] = icmp slt i32 [[IND]], [[Z]]
329c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW2]]
339c51e518SRuiling, Song; CHECK:       [[FLOW2]]:
34*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP5]] = phi i32 [ [[IND_INC]], %[[LATCH]] ], [ undef, %[[FLOW1]] ]
35*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP6:%.*]] = phi i1 [ [[CC3]], %[[LATCH]] ], [ true, %[[FLOW1]] ]
36*54d31bdeSRuiling, Song; CHECK-NEXT:    br i1 [[TMP6]], label %[[END:.*]], label %[[HEADER]]
379c51e518SRuiling, Song; CHECK:       [[END]]:
389c51e518SRuiling, Song; CHECK-NEXT:    ret float [[TMP8]]
399c51e518SRuiling, Song;
409c51e518SRuiling, Songentry:
419c51e518SRuiling, Song  br label %header
429c51e518SRuiling, Song
439c51e518SRuiling, Songheader:
449c51e518SRuiling, Song  %v.1 = phi float [ %v, %entry ], [ %v.2, %latch ]
459c51e518SRuiling, Song  %ind = phi i32 [ 0, %entry], [ %ind.inc, %latch ]
469c51e518SRuiling, Song  %cc = icmp slt i32 %ind, %x
479c51e518SRuiling, Song  br i1 %cc, label %if, label %else
489c51e518SRuiling, Song
499c51e518SRuiling, Songif:
509c51e518SRuiling, Song  %v.if = fadd float %v.1, 1.0
519c51e518SRuiling, Song  br label %latch
529c51e518SRuiling, Song
539c51e518SRuiling, Songelse:
549c51e518SRuiling, Song  %cc2 = icmp slt i32 %ind, %y
559c51e518SRuiling, Song  br i1 %cc2, label %latch, label %end
569c51e518SRuiling, Song
579c51e518SRuiling, Songlatch:
589c51e518SRuiling, Song  %v.2 = phi float [ %v.if, %if ], [ %v.1, %else ]
599c51e518SRuiling, Song  %ind.inc = add i32 %ind, 1
609c51e518SRuiling, Song  %cc3 = icmp slt i32 %ind, %z
619c51e518SRuiling, Song  br i1 %cc3, label %end, label %header
629c51e518SRuiling, Song
639c51e518SRuiling, Songend:
649c51e518SRuiling, Song  %r = phi float [ %v.2, %latch ], [ %v.1, %else ]
659c51e518SRuiling, Song  ret float %r
669c51e518SRuiling, Song}
679c51e518SRuiling, Song
689c51e518SRuiling, Song; Just different dfs order from while_break.
699c51e518SRuiling, Songdefine float @while_break2(i32 %z, float %v, i32 %x, i32 %y) #0 {
709c51e518SRuiling, Song; CHECK-LABEL: define float @while_break2(
719c51e518SRuiling, Song; CHECK-SAME: i32 [[Z:%.*]], float [[V:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR0]] {
729c51e518SRuiling, Song; CHECK-NEXT:  [[ENTRY:.*]]:
739c51e518SRuiling, Song; CHECK-NEXT:    br label %[[HEADER:.*]]
749c51e518SRuiling, Song; CHECK:       [[HEADER]]:
75*54d31bdeSRuiling, Song; CHECK-NEXT:    [[V_1:%.*]] = phi float [ [[V]], %[[ENTRY]] ], [ [[TMP8:%.*]], %[[FLOW2:.*]] ]
76*54d31bdeSRuiling, Song; CHECK-NEXT:    [[IND:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[TMP5:%.*]], %[[FLOW2]] ]
779c51e518SRuiling, Song; CHECK-NEXT:    [[CC:%.*]] = icmp sge i32 [[IND]], [[X]]
789c51e518SRuiling, Song; CHECK-NEXT:    br i1 [[CC]], label %[[IF:.*]], label %[[FLOW:.*]]
799c51e518SRuiling, Song; CHECK:       [[IF]]:
809c51e518SRuiling, Song; CHECK-NEXT:    [[V_IF:%.*]] = fadd float [[V_1]], 1.000000e+00
819c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW]]
829c51e518SRuiling, Song; CHECK:       [[FLOW]]:
839c51e518SRuiling, Song; CHECK-NEXT:    [[TMP0:%.*]] = phi float [ [[V_IF]], %[[IF]] ], [ undef, %[[HEADER]] ]
849c51e518SRuiling, Song; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ true, %[[IF]] ], [ false, %[[HEADER]] ]
859c51e518SRuiling, Song; CHECK-NEXT:    [[TMP2:%.*]] = phi i1 [ false, %[[IF]] ], [ true, %[[HEADER]] ]
869c51e518SRuiling, Song; CHECK-NEXT:    br i1 [[TMP2]], label %[[ELSE:.*]], label %[[FLOW1:.*]]
879c51e518SRuiling, Song; CHECK:       [[ELSE]]:
889c51e518SRuiling, Song; CHECK-NEXT:    [[CC2:%.*]] = icmp slt i32 [[IND]], [[Y]]
899c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW1]]
909c51e518SRuiling, Song; CHECK:       [[FLOW1]]:
91*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP8]] = phi float [ [[V_1]], %[[ELSE]] ], [ [[TMP0]], %[[FLOW]] ]
92*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP4:%.*]] = phi i1 [ [[CC2]], %[[ELSE]] ], [ [[TMP1]], %[[FLOW]] ]
93*54d31bdeSRuiling, Song; CHECK-NEXT:    br i1 [[TMP4]], label %[[LATCH:.*]], label %[[FLOW2]]
949c51e518SRuiling, Song; CHECK:       [[LATCH]]:
959c51e518SRuiling, Song; CHECK-NEXT:    [[IND_INC:%.*]] = add i32 [[IND]], 1
969c51e518SRuiling, Song; CHECK-NEXT:    [[CC3:%.*]] = icmp slt i32 [[IND]], [[Z]]
979c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW2]]
989c51e518SRuiling, Song; CHECK:       [[FLOW2]]:
99*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP5]] = phi i32 [ [[IND_INC]], %[[LATCH]] ], [ undef, %[[FLOW1]] ]
100*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP6:%.*]] = phi i1 [ [[CC3]], %[[LATCH]] ], [ true, %[[FLOW1]] ]
101*54d31bdeSRuiling, Song; CHECK-NEXT:    br i1 [[TMP6]], label %[[END:.*]], label %[[HEADER]]
1029c51e518SRuiling, Song; CHECK:       [[END]]:
1039c51e518SRuiling, Song; CHECK-NEXT:    ret float [[TMP8]]
1049c51e518SRuiling, Song;
1059c51e518SRuiling, Songentry:
1069c51e518SRuiling, Song  br label %header
1079c51e518SRuiling, Song
1089c51e518SRuiling, Songheader:
1099c51e518SRuiling, Song  %v.1 = phi float [ %v, %entry ], [ %v.2, %latch ]
1109c51e518SRuiling, Song  %ind = phi i32 [ 0, %entry], [ %ind.inc, %latch ]
1119c51e518SRuiling, Song  %cc = icmp slt i32 %ind, %x
1129c51e518SRuiling, Song  br i1 %cc, label %else, label %if
1139c51e518SRuiling, Song
1149c51e518SRuiling, Songif:
1159c51e518SRuiling, Song  %v.if = fadd float %v.1, 1.0
1169c51e518SRuiling, Song  br label %latch
1179c51e518SRuiling, Song
1189c51e518SRuiling, Songelse:
1199c51e518SRuiling, Song  %cc2 = icmp slt i32 %ind, %y
1209c51e518SRuiling, Song  br i1 %cc2, label %latch, label %end
1219c51e518SRuiling, Song
1229c51e518SRuiling, Songlatch:
1239c51e518SRuiling, Song  %v.2 = phi float [ %v.if, %if ], [ %v.1, %else ]
1249c51e518SRuiling, Song  %ind.inc = add i32 %ind, 1
1259c51e518SRuiling, Song  %cc3 = icmp slt i32 %ind, %z
1269c51e518SRuiling, Song  br i1 %cc3, label %end, label %header
1279c51e518SRuiling, Song
1289c51e518SRuiling, Songend:
1299c51e518SRuiling, Song  %r = phi float [ %v.2, %latch ], [ %v.1, %else ]
1309c51e518SRuiling, Song  ret float %r
1319c51e518SRuiling, Song}
1329c51e518SRuiling, Song
1339c51e518SRuiling, Song; Two chains of phi network that have the same value from %if block.
1349c51e518SRuiling, Songdefine < 2 x float> @while_break_two_chains_of_phi(float %v, i32 %x, i32 %y, i32 %z, ptr addrspace(1) %p) #0 {
1359c51e518SRuiling, Song; CHECK-LABEL: define <2 x float> @while_break_two_chains_of_phi(
1369c51e518SRuiling, Song; CHECK-SAME: float [[V:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]], ptr addrspace(1) [[P:%.*]]) #[[ATTR0]] {
1379c51e518SRuiling, Song; CHECK-NEXT:  [[ENTRY:.*]]:
1389c51e518SRuiling, Song; CHECK-NEXT:    br label %[[HEADER:.*]]
1399c51e518SRuiling, Song; CHECK:       [[HEADER]]:
140*54d31bdeSRuiling, Song; CHECK-NEXT:    [[V_1:%.*]] = phi float [ [[V]], %[[ENTRY]] ], [ [[TMP8:%.*]], %[[FLOW1:.*]] ]
141*54d31bdeSRuiling, Song; CHECK-NEXT:    [[V_COPY:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[TMP7:%.*]], %[[FLOW1]] ]
142*54d31bdeSRuiling, Song; CHECK-NEXT:    [[IND:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[TMP3:%.*]], %[[FLOW1]] ]
1439c51e518SRuiling, Song; CHECK-NEXT:    [[CC:%.*]] = icmp slt i32 [[IND]], [[X]]
1449c51e518SRuiling, Song; CHECK-NEXT:    [[CC_INV:%.*]] = xor i1 [[CC]], true
1459c51e518SRuiling, Song; CHECK-NEXT:    br i1 [[CC]], label %[[IF:.*]], label %[[FLOW:.*]]
1469c51e518SRuiling, Song; CHECK:       [[IF]]:
1479c51e518SRuiling, Song; CHECK-NEXT:    [[V_PTR:%.*]] = getelementptr float, ptr addrspace(1) [[P]], i32 [[IND]]
1489c51e518SRuiling, Song; CHECK-NEXT:    [[V_LOAD:%.*]] = load float, ptr addrspace(1) [[V_PTR]], align 4
1499c51e518SRuiling, Song; CHECK-NEXT:    [[V_IF:%.*]] = fadd float [[V_LOAD]], 1.000000e+00
1509c51e518SRuiling, Song; CHECK-NEXT:    [[CC2:%.*]] = icmp slt i32 [[IND]], [[Y]]
1519c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW]]
1529c51e518SRuiling, Song; CHECK:       [[FLOW]]:
153*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP7]] = phi float [ [[V_IF]], %[[IF]] ], [ [[V_COPY]], %[[HEADER]] ]
154*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP8]] = phi float [ [[V_IF]], %[[IF]] ], [ [[V_1]], %[[HEADER]] ]
155*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP2:%.*]] = phi i1 [ [[CC2]], %[[IF]] ], [ [[CC_INV]], %[[HEADER]] ]
156*54d31bdeSRuiling, Song; CHECK-NEXT:    br i1 [[TMP2]], label %[[LATCH:.*]], label %[[FLOW1]]
1579c51e518SRuiling, Song; CHECK:       [[LATCH]]:
1589c51e518SRuiling, Song; CHECK-NEXT:    [[IND_INC:%.*]] = add i32 [[IND]], 1
1599c51e518SRuiling, Song; CHECK-NEXT:    [[CC3:%.*]] = icmp slt i32 [[IND]], [[Z]]
1609c51e518SRuiling, Song; CHECK-NEXT:    br label %[[FLOW1]]
1619c51e518SRuiling, Song; CHECK:       [[FLOW1]]:
162*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP3]] = phi i32 [ [[IND_INC]], %[[LATCH]] ], [ undef, %[[FLOW]] ]
163*54d31bdeSRuiling, Song; CHECK-NEXT:    [[TMP4:%.*]] = phi i1 [ [[CC3]], %[[LATCH]] ], [ true, %[[FLOW]] ]
164*54d31bdeSRuiling, Song; CHECK-NEXT:    br i1 [[TMP4]], label %[[END:.*]], label %[[HEADER]]
1659c51e518SRuiling, Song; CHECK:       [[END]]:
1669c51e518SRuiling, Song; CHECK-NEXT:    [[PACKED0:%.*]] = insertelement <2 x float> poison, float [[TMP8]], i32 0
1679c51e518SRuiling, Song; CHECK-NEXT:    [[PACKED1:%.*]] = insertelement <2 x float> [[PACKED0]], float [[TMP7]], i32 1
1689c51e518SRuiling, Song; CHECK-NEXT:    ret <2 x float> [[PACKED1]]
1699c51e518SRuiling, Song;
1709c51e518SRuiling, Songentry:
1719c51e518SRuiling, Song  br label %header
1729c51e518SRuiling, Song
1739c51e518SRuiling, Songheader:
1749c51e518SRuiling, Song  %v.1 = phi float [ %v, %entry ], [ %v.2, %latch ]
1759c51e518SRuiling, Song  %v.copy = phi float [ 0.0, %entry ], [ %v.copy.2, %latch ]
1769c51e518SRuiling, Song  %ind = phi i32 [ 0, %entry], [ %ind.inc, %latch ]
1779c51e518SRuiling, Song  %cc = icmp slt i32 %ind, %x
1789c51e518SRuiling, Song  br i1 %cc, label %if, label %latch
1799c51e518SRuiling, Song
1809c51e518SRuiling, Songif:
1819c51e518SRuiling, Song  %v.ptr = getelementptr float, ptr addrspace(1) %p, i32 %ind
1829c51e518SRuiling, Song  %v.load = load float, ptr addrspace(1) %v.ptr
1839c51e518SRuiling, Song  %v.if = fadd float %v.load, 1.0
1849c51e518SRuiling, Song  %cc2 = icmp slt i32 %ind, %y
1859c51e518SRuiling, Song  br i1 %cc2, label %latch, label %end
1869c51e518SRuiling, Song
1879c51e518SRuiling, Songlatch:
1889c51e518SRuiling, Song  %v.2 = phi float [ %v.1, %header ], [ %v.if, %if ]
1899c51e518SRuiling, Song  %v.copy.2 = phi float [ %v.copy, %header ], [ %v.if, %if ]
1909c51e518SRuiling, Song  %ind.inc = add i32 %ind, 1
1919c51e518SRuiling, Song  %cc3 = icmp slt i32 %ind, %z
1929c51e518SRuiling, Song  br i1 %cc3, label %end, label %header
1939c51e518SRuiling, Song
1949c51e518SRuiling, Songend:
1959c51e518SRuiling, Song  %r = phi float [ %v.2, %latch ], [ %v.if, %if ]
1969c51e518SRuiling, Song  %r2 = phi float [ %v.copy.2, %latch ], [ %v.if, %if ]
1979c51e518SRuiling, Song  %packed0 = insertelement < 2 x float > poison, float %r, i32 0
1989c51e518SRuiling, Song  %packed1 = insertelement < 2 x float > %packed0, float %r2, i32 1
1999c51e518SRuiling, Song  ret < 2 x float> %packed1
2009c51e518SRuiling, Song}
2019c51e518SRuiling, Song
2029c51e518SRuiling, Songattributes #0 = { nounwind }
203