@@ -35,16 +35,19 @@ define void @test1() {
3535; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX55]], align 1
3636; CHECK-NEXT: [[ADD61:%.*]] = add i32 undef, undef
3737; CHECK-NEXT: [[INC63:%.*]] = add nsw i16 [[K_09]], 1
38+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[K_09]], 42
3839; CHECK-NEXT: br label [[FOR_END67]]
3940; CHECK: for.body42.split:
4041; CHECK-NEXT: [[ADD61_LCSSA:%.*]] = phi i32 [ [[ADD61]], [[FOR_END67]] ]
4142; CHECK-NEXT: [[TMP1]] = add nsw i16 [[K_09]], 1
42- ; CHECK-NEXT: br i1 true, label [[FOR_END64]], label [[FOR_BODY42]]
43+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i16 [[K_09]], 42
44+ ; CHECK-NEXT: br i1 [[TMP2]], label [[FOR_BODY42]], label [[FOR_END64]]
4345; CHECK: for.end64:
4446; CHECK-NEXT: [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61_LCSSA]], [[FOR_BODY42_SPLIT]] ]
4547; CHECK-NEXT: store i32 [[ADD61_LCSSA_LCSSA]], ptr undef, align 1
4648; CHECK-NEXT: [[INC66]] = add nuw nsw i16 [[J_010]], 1
47- ; CHECK-NEXT: br i1 true, label [[FOR_COND75_PREHEADER:%.*]], label [[FOR_COND37_PREHEADER]]
49+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[J_010]], 43
50+ ; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_COND37_PREHEADER]], label [[FOR_COND75_PREHEADER:%.*]]
4851; CHECK: for.end67:
4952; CHECK-NEXT: [[INC69]] = add nuw nsw i16 [[I_011]], 1
5053; CHECK-NEXT: [[EXITCOND13_NOT:%.*]] = icmp eq i16 [[INC69]], 2
@@ -72,12 +75,14 @@ for.body42: ; preds = %for.body42, %for.co
7275 %0 = load i32 , ptr %arrayidx55 , align 1
7376 %add61 = add i32 undef , undef
7477 %inc63 = add nsw i16 %k.09 , 1
75- br i1 true , label %for.end64 , label %for.body42
78+ %cmp = icmp slt i16 %k.09 , 42
79+ br i1 %cmp , label %for.body42 , label %for.end64
7680
7781for.end64: ; preds = %for.body42
7882 store i32 %add61 , ptr undef , align 1
7983 %inc66 = add nuw nsw i16 %j.010 , 1
80- br i1 true , label %for.end67 , label %for.cond37.preheader
84+ %cmp2 = icmp slt i16 %j.010 , 43
85+ br i1 %cmp2 , label %for.cond37.preheader , label %for.end67
8186
8287for.end67: ; preds = %for.end64
8388 %inc69 = add nuw nsw i16 %i.011 , 1
@@ -88,7 +93,6 @@ for.cond75: ; preds = %for.cond75, %for.en
8893 br label %for.cond75
8994}
9095
91-
9296; Make sure that we split the phi nodes in the middle loop header
9397; into a separate basic block to avoid the situation where use of
9498; the outermost indvar appears before its def after interchanging
@@ -98,40 +102,42 @@ for.cond75: ; preds = %for.cond75, %for.en
98102define void @test2 () {
99103; CHECK-LABEL: @test2(
100104; CHECK-NEXT: entry:
101- ; CHECK-NEXT: br label [[FOR_COND37_PREHEADER_PREHEADER:%.*]]
102- ; CHECK: for.cond33.preheader.preheader:
103105; CHECK-NEXT: br label [[FOR_COND33_PREHEADER:%.*]]
106+ ; CHECK: for.cond33.preheader.preheader:
107+ ; CHECK-NEXT: br label [[FOR_COND33_PREHEADER1:%.*]]
104108; CHECK: for.cond33.preheader:
105109; CHECK-NEXT: [[I_166:%.*]] = phi i16 [ [[INC69:%.*]], [[FOR_INC68:%.*]] ], [ 0, [[FOR_COND33_PREHEADER_PREHEADER:%.*]] ]
106110; CHECK-NEXT: [[ARRAYIDX60:%.*]] = getelementptr inbounds [2 x [4 x i32]], ptr @c, i16 0, i16 [[I_166]], i16 [[J_165:%.*]]
107- ; CHECK-NEXT: br label [[VECTOR_BODY85_SPLIT1:%.*]]
108- ; CHECK: for.cond37.preheader.preheader:
109111; CHECK-NEXT: br label [[FOR_COND37_PREHEADER:%.*]]
112+ ; CHECK: for.cond37.preheader.preheader:
113+ ; CHECK-NEXT: br label [[FOR_COND37_PREHEADER1:%.*]]
110114; CHECK: for.cond37.preheader:
111- ; CHECK-NEXT: [[J_165]] = phi i16 [ [[INC66:%.*]], [[MIDDLE_BLOCK80:%.*]] ], [ 0, [[FOR_COND37_PREHEADER_PREHEADER]] ]
112- ; CHECK-NEXT: br label [[FOR_COND37_PREHEADER_SPLIT:%.*]]
113- ; CHECK: for.cond37.preheader.split:
115+ ; CHECK-NEXT: [[J_165]] = phi i16 [ [[INC66:%.*]], [[MIDDLE_BLOCK80:%.*]] ], [ 0, [[FOR_COND33_PREHEADER]] ]
114116; CHECK-NEXT: br label [[VECTOR_BODY85:%.*]]
117+ ; CHECK: for.cond37.preheader.split:
118+ ; CHECK-NEXT: br label [[VECTOR_BODY86:%.*]]
115119; CHECK: vector.body85:
116- ; CHECK-NEXT: [[INDEX86:%.*]] = phi i16 [ 0, [[FOR_COND37_PREHEADER_SPLIT ]] ], [ [[TMP3 :%.*]], [[VECTOR_BODY85_SPLIT:%.*]] ]
120+ ; CHECK-NEXT: [[INDEX86:%.*]] = phi i16 [ 0, [[VECTOR_BODY85 ]] ], [ [[TMP5 :%.*]], [[VECTOR_BODY85_SPLIT:%.*]] ]
117121; CHECK-NEXT: br label [[FOR_COND33_PREHEADER_PREHEADER]]
118122; CHECK: vector.body85.split1:
119123; CHECK-NEXT: [[TMP0:%.*]] = or disjoint i16 [[INDEX86]], 2
120124; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 [[TMP0]], i16 [[J_165]]
121125; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
122- ; CHECK-NEXT: [[INDEX_NEXT87:%.*]] = add nuw i16 [[INDEX86]], 4
126+ ; CHECK-NEXT: [[TMP3:%.*]] = add nuw i16 [[INDEX86]], 4
127+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[INDEX86]], 42
123128; CHECK-NEXT: br label [[FOR_INC68]]
124129; CHECK: vector.body85.split:
125- ; CHECK-NEXT: [[TMP3]] = add nuw i16 [[INDEX86]], 4
126- ; CHECK-NEXT: br i1 true, label [[MIDDLE_BLOCK80]], label [[VECTOR_BODY85]]
130+ ; CHECK-NEXT: [[TMP5]] = add nuw i16 [[INDEX86]], 4
131+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i16 [[INDEX86]], 42
132+ ; CHECK-NEXT: br i1 [[TMP4]], label [[VECTOR_BODY86]], label [[MIDDLE_BLOCK80]]
127133; CHECK: middle.block80:
128134; CHECK-NEXT: [[INC66]] = add nuw nsw i16 [[J_165]], 1
129135; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[INC66]], 42
130- ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_COND75_PREHEADER:%.* ]], label [[FOR_COND37_PREHEADER ]]
136+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_COND37_PREHEADER1 ]], label [[FOR_COND75_PREHEADER:%.* ]]
131137; CHECK: for.inc68:
132138; CHECK-NEXT: [[INC69]] = add nuw nsw i16 [[I_166]], 1
133- ; CHECK-NEXT: [[EXITCOND77_NOT:%.*]] = icmp eq i16 [[INC69]], 2
134- ; CHECK-NEXT: br i1 [[EXITCOND77_NOT]], label [[VECTOR_BODY85_SPLIT ]], label [[FOR_COND33_PREHEADER ]]
139+ ; CHECK-NEXT: [[EXITCOND77_NOT:%.*]] = icmp slt i16 [[INC69]], 24
140+ ; CHECK-NEXT: br i1 [[EXITCOND77_NOT]], label [[FOR_COND33_PREHEADER1 ]], label [[VECTOR_BODY85_SPLIT ]]
135141; CHECK: for.cond75.preheader:
136142; CHECK-NEXT: unreachable
137143;
@@ -153,17 +159,18 @@ vector.body85: ; preds = %vector.body85, %for
153159 %1 = getelementptr inbounds [512 x [4 x i32 ]], ptr @b , i16 0 , i16 %0 , i16 %j.165
154160 %2 = load i32 , ptr %1 , align 1
155161 %index.next87 = add nuw i16 %index86 , 4
156- br i1 true , label %middle.block80 , label %vector.body85
162+ %cmp2 = icmp slt i16 %index86 , 42
163+ br i1 %cmp2 , label %vector.body85 , label %middle.block80
157164
158165middle.block80: ; preds = %vector.body85
159166 %inc66 = add nuw nsw i16 %j.165 , 1
160167 %cmp = icmp slt i16 %inc66 , 42
161- br i1 %cmp , label %for.inc68 , label %for.cond37.preheader
168+ br i1 %cmp , label %for.cond37.preheader , label %for.inc68
162169
163170for.inc68: ; preds = %middle.block80
164171 %inc69 = add nuw nsw i16 %i.166 , 1
165- %exitcond77.not = icmp eq i16 %inc69 , 2
166- br i1 %exitcond77.not , label %for.cond75 .preheader , label %for.cond33 .preheader
172+ %exitcond77.not = icmp slt i16 %inc69 , 24
173+ br i1 %exitcond77.not , label %for.cond33 .preheader , label %for.cond75 .preheader
167174
168175for.cond75.preheader: ; preds = %for.inc68
169176 unreachable
@@ -178,11 +185,11 @@ define void @test3() {
178185; CHECK-NEXT: br label [[FOR_COND33_PREHEADER:%.*]]
179186; CHECK: for.cond33.preheader:
180187; CHECK-NEXT: [[I_011:%.*]] = phi i16 [ [[INC69:%.*]], [[FOR_END67:%.*]] ], [ 0, [[FOR_COND33_PREHEADER_PREHEADER:%.*]] ]
181- ; CHECK-NEXT: br label [[FOR_BODY42_SPLIT1 :%.*]]
188+ ; CHECK-NEXT: br label [[FOR_COND38_PREHEADER :%.*]]
182189; CHECK: for.body42.preheader:
183190; CHECK-NEXT: br label [[FOR_BODY42:%.*]]
184191; CHECK: for.cond38.preheader.preheader:
185- ; CHECK-NEXT: br label [[FOR_COND38_PREHEADER :%.*]]
192+ ; CHECK-NEXT: br label [[FOR_COND38_PREHEADER1 :%.*]]
186193; CHECK: for.cond37.preheader.preheader:
187194; CHECK-NEXT: br label [[FOR_COND37_PREHEADER:%.*]]
188195; CHECK: for.cond37.preheader:
@@ -192,27 +199,31 @@ define void @test3() {
192199; CHECK-NEXT: [[K_010:%.*]] = phi i16 [ [[INC67:%.*]], [[FOR_END65:%.*]] ], [ 0, [[FOR_COND38_PREHEADER_PREHEADER]] ]
193200; CHECK-NEXT: br label [[FOR_BODY42_PREHEADER:%.*]]
194201; CHECK: for.body42:
195- ; CHECK-NEXT: [[K_09:%.*]] = phi i16 [ [[TMP1 :%.*]], [[FOR_BODY42_SPLIT:%.*]] ], [ -512, [[FOR_BODY42_PREHEADER]] ]
202+ ; CHECK-NEXT: [[K_09:%.*]] = phi i16 [ [[TMP3 :%.*]], [[FOR_BODY42_SPLIT:%.*]] ], [ -512, [[FOR_BODY42_PREHEADER]] ]
196203; CHECK-NEXT: br label [[FOR_COND33_PREHEADER_PREHEADER]]
197204; CHECK: for.body42.split1:
198205; CHECK-NEXT: [[SUB51:%.*]] = add nsw i16 [[K_09]], 512
199206; CHECK-NEXT: [[ARRAYIDX55:%.*]] = getelementptr inbounds [1024 x [512 x [4 x i32]]], ptr @d, i16 0, i16 [[SUB51]], i16 [[J_010]], i16 [[K_010]]
200207; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX55]], align 1
201208; CHECK-NEXT: [[ADD61:%.*]] = add i32 undef, undef
202- ; CHECK-NEXT: [[INC63:%.*]] = add nsw i16 [[K_09]], 1
209+ ; CHECK-NEXT: [[TMP1:%.*]] = add nsw i16 [[K_09]], 1
210+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[K_09]], 42
203211; CHECK-NEXT: br label [[FOR_END67]]
204212; CHECK: for.body42.split:
205213; CHECK-NEXT: [[ADD61_LCSSA:%.*]] = phi i32 [ [[ADD61]], [[FOR_END67]] ]
206- ; CHECK-NEXT: [[TMP1]] = add nsw i16 [[K_09]], 1
207- ; CHECK-NEXT: br i1 true, label [[FOR_END65]], label [[FOR_BODY42]]
214+ ; CHECK-NEXT: [[TMP3]] = add nsw i16 [[K_09]], 1
215+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i16 [[K_09]], 42
216+ ; CHECK-NEXT: br i1 [[TMP2]], label [[FOR_BODY42]], label [[FOR_END65]]
208217; CHECK: for.end65:
209218; CHECK-NEXT: [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61_LCSSA]], [[FOR_BODY42_SPLIT]] ]
210219; CHECK-NEXT: store i32 [[ADD61_LCSSA_LCSSA]], ptr undef, align 1
211220; CHECK-NEXT: [[INC67]] = add nuw nsw i16 [[K_010]], 1
212- ; CHECK-NEXT: br i1 true, label [[FOR_END64]], label [[FOR_COND38_PREHEADER]]
221+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i16 [[K_010]], 44
222+ ; CHECK-NEXT: br i1 [[CMP3]], label [[FOR_COND38_PREHEADER1]], label [[FOR_END64]]
213223; CHECK: for.end64:
214224; CHECK-NEXT: [[INC66]] = add nuw nsw i16 [[J_010]], 1
215- ; CHECK-NEXT: br i1 true, label [[FOR_COND75_PREHEADER:%.*]], label [[FOR_COND37_PREHEADER]]
225+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[J_010]], 43
226+ ; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_COND37_PREHEADER]], label [[FOR_COND75_PREHEADER:%.*]]
216227; CHECK: for.end67:
217228; CHECK-NEXT: [[INC69]] = add nuw nsw i16 [[I_011]], 1
218229; CHECK-NEXT: [[EXITCOND13_NOT:%.*]] = icmp eq i16 [[INC69]], 2
@@ -244,16 +255,19 @@ for.body42: ; preds = %for.body42, %for.co
244255 %0 = load i32 , ptr %arrayidx55 , align 1
245256 %add61 = add i32 undef , undef
246257 %inc63 = add nsw i16 %k.09 , 1
247- br i1 true , label %for.end65 , label %for.body42
258+ %cmp = icmp slt i16 %k.09 , 42
259+ br i1 %cmp , label %for.body42 , label %for.end65
248260
249261for.end65: ; preds = %for.body42
250262 store i32 %add61 , ptr undef , align 1
251263 %inc67 = add nuw nsw i16 %k.010 , 1
252- br i1 true , label %for.end64 , label %for.cond38.preheader
264+ %cmp3 = icmp slt i16 %k.010 , 44
265+ br i1 %cmp3 , label %for.cond38.preheader , label %for.end64
253266
254267for.end64: ; preds = %for.end65
255268 %inc66 = add nuw nsw i16 %j.010 , 1
256- br i1 true , label %for.end67 , label %for.cond37.preheader
269+ %cmp2 = icmp slt i16 %j.010 , 43
270+ br i1 %cmp2 , label %for.cond37.preheader , label %for.end67
257271
258272for.end67: ; preds = %for.end64
259273 %inc69 = add nuw nsw i16 %i.011 , 1
0 commit comments