@@ -1163,4 +1163,74 @@ exit:
1163
1163
ret i32 %iv
1164
1164
}
1165
1165
1166
+ ; Do not optimize: comparison against different variant values.
1167
+ define i32 @test_ult_different_variants_neg (i32 %start_1 , i32 %start_2 , i32 %inv_1 , i32 %inv_2 ) {
1168
+ ; CHECK-LABEL: @test_ult_different_variants_neg(
1169
+ ; CHECK-NEXT: entry:
1170
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
1171
+ ; CHECK: loop:
1172
+ ; CHECK-NEXT: [[IV_1:%.*]] = phi i32 [ [[START_1:%.*]], [[ENTRY:%.*]] ], [ [[IV_1_NEXT:%.*]], [[LOOP]] ]
1173
+ ; CHECK-NEXT: [[IV_2:%.*]] = phi i32 [ [[START_2:%.*]], [[ENTRY]] ], [ [[IV_2_NEXT:%.*]], [[LOOP]] ]
1174
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ult i32 [[IV_1]], [[INV_1:%.*]]
1175
+ ; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i32 [[IV_2]], [[INV_2:%.*]]
1176
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
1177
+ ; CHECK-NEXT: [[IV_1_NEXT]] = add i32 [[IV_1]], 1
1178
+ ; CHECK-NEXT: [[IV_2_NEXT]] = add i32 [[IV_2]], 1
1179
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
1180
+ ; CHECK: exit:
1181
+ ; CHECK-NEXT: [[IV_1_LCSSA:%.*]] = phi i32 [ [[IV_1]], [[LOOP]] ]
1182
+ ; CHECK-NEXT: ret i32 [[IV_1_LCSSA]]
1183
+ ;
1184
+ entry:
1185
+ br label %loop
1186
+
1187
+ loop:
1188
+ %iv_1 = phi i32 [%start_1 , %entry ], [%iv_1.next , %loop ]
1189
+ %iv_2 = phi i32 [%start_2 , %entry ], [%iv_2.next , %loop ]
1190
+ %cmp_1 = icmp ult i32 %iv_1 , %inv_1
1191
+ %cmp_2 = icmp ult i32 %iv_2 , %inv_2
1192
+ %loop_cond = and i1 %cmp_1 , %cmp_2
1193
+ %iv_1.next = add i32 %iv_1 , 1
1194
+ %iv_2.next = add i32 %iv_2 , 1
1195
+ br i1 %loop_cond , label %loop , label %exit
1196
+
1197
+ exit:
1198
+ ret i32 %iv_1
1199
+ }
1200
+
1201
+ ; Do not optimize: one of comparisons is against loop-variant.
1202
+ define i32 @test_ult_compare_against_variant_neg (i32 %start_1 , i32 %start_2 , i32 %inv_1 , i32 %inv_2 ) {
1203
+ ; CHECK-LABEL: @test_ult_compare_against_variant_neg(
1204
+ ; CHECK-NEXT: entry:
1205
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
1206
+ ; CHECK: loop:
1207
+ ; CHECK-NEXT: [[IV_1:%.*]] = phi i32 [ [[START_1:%.*]], [[ENTRY:%.*]] ], [ [[IV_1_NEXT:%.*]], [[LOOP]] ]
1208
+ ; CHECK-NEXT: [[IV_2:%.*]] = phi i32 [ [[START_2:%.*]], [[ENTRY]] ], [ [[IV_2_NEXT:%.*]], [[LOOP]] ]
1209
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ult i32 [[IV_1]], [[INV_1:%.*]]
1210
+ ; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i32 [[IV_1]], [[IV_2]]
1211
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
1212
+ ; CHECK-NEXT: [[IV_1_NEXT]] = add i32 [[IV_1]], 1
1213
+ ; CHECK-NEXT: [[IV_2_NEXT]] = add i32 [[IV_2]], 1
1214
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
1215
+ ; CHECK: exit:
1216
+ ; CHECK-NEXT: [[IV_1_LCSSA:%.*]] = phi i32 [ [[IV_1]], [[LOOP]] ]
1217
+ ; CHECK-NEXT: ret i32 [[IV_1_LCSSA]]
1218
+ ;
1219
+ entry:
1220
+ br label %loop
1221
+
1222
+ loop:
1223
+ %iv_1 = phi i32 [%start_1 , %entry ], [%iv_1.next , %loop ]
1224
+ %iv_2 = phi i32 [%start_2 , %entry ], [%iv_2.next , %loop ]
1225
+ %cmp_1 = icmp ult i32 %iv_1 , %inv_1
1226
+ %cmp_2 = icmp ult i32 %iv_1 , %iv_2
1227
+ %loop_cond = and i1 %cmp_1 , %cmp_2
1228
+ %iv_1.next = add i32 %iv_1 , 1
1229
+ %iv_2.next = add i32 %iv_2 , 1
1230
+ br i1 %loop_cond , label %loop , label %exit
1231
+
1232
+ exit:
1233
+ ret i32 %iv_1
1234
+ }
1235
+
1166
1236
declare void @use (i1 )
0 commit comments