[llvm] [LSR] Deduplicate cast instructions across ICmpZero fixups (PR #201970)

Timur Golubovich via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 8 07:58:27 PDT 2026


timurgol007 wrote:

Sorry for delay, I needed some time to extract it. So, this is the IR before loop-reduce (after loop-canonicalize) and after loop-reduce:

```ll
*** IR Dump After Canonicalize Freeze Instructions in Loops (canon-freeze) ***
; Preheader:
1208:                                             ; preds = %1204
  %1209 = getelementptr inbounds nuw i64, ptr %1095, i64 %1206, !intel-tbaa !782
  %1210 = getelementptr inbounds nuw i64, ptr %972, i64 %1206, !intel-tbaa !782
  %1211 = getelementptr inbounds nuw i64, ptr %1094, i64 %1206, !intel-tbaa !782
  %1212 = zext i64 %1205 to i128
  %1213 = getelementptr inbounds nuw %"class._ZTSN4seal7ModulusE.seal::Modulus", ptr %1096, i64 0, i32 1, i32 0, i64 1
  %1214 = getelementptr inbounds nuw i64, ptr %1097, i64 1
  br label %1215

; Loop:
1215:                                             ; preds = %1224, %1208
  %1216 = phi ptr [ %972, %1208 ], [ %1272, %1224 ]
  %1217 = phi ptr [ %1095, %1208 ], [ %1271, %1224 ]
  %1218 = phi ptr [ %1094, %1208 ], [ %1273, %1224 ]
  %1219 = icmp eq ptr %1217, %1209
  br i1 %1219, label %1220, label %1224

1220:                                             ; preds = %1215
  %1221 = icmp ne ptr %1216, %1210
  %1222 = icmp ne ptr %1218, %1211
  %1223 = select i1 %1221, i1 true, i1 %1222
  br i1 %1223, label %1224, label %1274

1224:                                             ; preds = %1220, %1215
  %1225 = load i64, ptr %1216, align 8, !tbaa !782, !noalias !834
  %1226 = icmp ult i64 %1225, %925
  %1227 = load i64, ptr %1096, align 8, !tbaa !798, !noalias !834
  %1228 = load i64, ptr %427, align 8
  %1229 = add i64 %1227, %1225
  %1230 = sub i64 %1229, %1228
  %1231 = select i1 %1226, i64 %1225, i64 %1230
  %1232 = load i64, ptr %1217, align 8, !tbaa !782, !noalias !834
  %1233 = zext i64 %1231 to i128
  %1234 = mul nuw i128 %1233, %1212
  %1235 = lshr i128 %1234, 64
  %1236 = trunc nuw i128 %1235 to i64
  %1237 = mul i64 %1231, %1109
  %1238 = mul i64 %1227, %1236
  %1239 = sub i64 %1237, %1238
  %1240 = icmp ult i64 %1239, %1227
  %1241 = select i1 %1240, i64 0, i64 %1227
  %1242 = sub i64 %1239, %1241
  %1243 = load i64, ptr %1213, align 8, !tbaa !839, !noalias !834
  %1244 = zext i64 %1232 to i128
  %1245 = zext i64 %1243 to i128
  %1246 = mul nuw i128 %1245, %1244
  %1247 = lshr i128 %1246, 64
  %1248 = trunc nuw i128 %1247 to i64
  %1249 = mul i64 %1227, %1248
  %1250 = sub i64 %1232, %1249
  %1251 = icmp ult i64 %1250, %1227
  %1252 = select i1 %1251, i64 0, i64 %1227
  %1253 = sub i64 %1250, %1252
  %1254 = add i64 %1253, %1242
  %1255 = icmp ult i64 %1254, %1227
  %1256 = select i1 %1255, i64 0, i64 %1227
  %1257 = sub i64 %1254, %1256
  %1258 = load i64, ptr %1097, align 8, !tbaa !782, !noalias !834
  %1259 = load i64, ptr %1214, align 8, !tbaa !782, !noalias !834
  %1260 = zext i64 %1257 to i128
  %1261 = zext i64 %1259 to i128
  %1262 = mul nuw i128 %1260, %1261
  %1263 = lshr i128 %1262, 64
  %1264 = trunc nuw i128 %1263 to i64
  %1265 = mul i64 %1257, %1258
  %1266 = mul i64 %1227, %1264
  %1267 = sub i64 %1265, %1266
  %1268 = icmp ult i64 %1267, %1227
  %1269 = select i1 %1268, i64 0, i64 %1227
  %1270 = sub i64 %1267, %1269
  store i64 %1270, ptr %1218, align 8, !tbaa !782, !noalias !834
  %1271 = getelementptr inbounds nuw i64, ptr %1217, i64 1
  %1272 = getelementptr inbounds nuw i64, ptr %1216, i64 1
  %1273 = getelementptr inbounds nuw i64, ptr %1218, i64 1
  br label %1215, !llvm.loop !840

; Exit blocks
1274:                                             ; preds = %1220
  br label %1275
*** IR Dump After Loop Strength Reduction (loop-reduce) ***
; Preheader:
1213:                                             ; preds = %1209
  %1214 = zext i64 %1210 to i128
  %1215 = getelementptr inbounds nuw %"class._ZTSN4seal7ModulusE.seal::Modulus", ptr %1101, i64 0, i32 1, i32 0, i64 1
  %1216 = getelementptr inbounds nuw i64, ptr %1102, i64 1
  %1217 = shl i64 %1211, 3
  %1218 = inttoptr i64 %1217 to ptr
  br label %1219

; Loop:
1219:                                             ; preds = %1232, %1213
  %1220 = phi i64 [ %1279, %1232 ], [ 0, %1213 ]
  %1221 = getelementptr i8, ptr %975, i64 %1220
  %1222 = getelementptr i8, ptr %1098, i64 %1220
  %1223 = getelementptr i8, ptr %1097, i64 %1220
  %1224 = inttoptr i64 %1220 to ptr
  %1225 = icmp eq ptr %1218, %1224
  br i1 %1225, label %1226, label %1232

1226:                                             ; preds = %1219
  %1227 = inttoptr i64 %1220 to ptr
  %1228 = icmp ne ptr %1218, %1227
  %1229 = inttoptr i64 %1220 to ptr
  %1230 = icmp ne ptr %1218, %1229
  %1231 = select i1 %1228, i1 true, i1 %1230
  br i1 %1231, label %1232, label %1280

1232:                                             ; preds = %1226, %1219
  %1233 = load i64, ptr %1221, align 8, !tbaa !782, !noalias !834
  %1234 = icmp ult i64 %1233, %928
  %1235 = load i64, ptr %1101, align 8, !tbaa !798, !noalias !834
  %1236 = load i64, ptr %427, align 8
  %1237 = add i64 %1235, %1233
  %1238 = sub i64 %1237, %1236
  %1239 = select i1 %1234, i64 %1233, i64 %1238
  %1240 = load i64, ptr %1222, align 8, !tbaa !782, !noalias !834
  %1241 = zext i64 %1239 to i128
  %1242 = mul nuw i128 %1241, %1214
  %1243 = lshr i128 %1242, 64
  %1244 = trunc nuw i128 %1243 to i64
  %1245 = mul i64 %1239, %1114
  %1246 = mul i64 %1235, %1244
  %1247 = sub i64 %1245, %1246
  %1248 = icmp ult i64 %1247, %1235
  %1249 = select i1 %1248, i64 0, i64 %1235
  %1250 = sub i64 %1247, %1249
  %1251 = load i64, ptr %1215, align 8, !tbaa !839, !noalias !834
  %1252 = zext i64 %1240 to i128
  %1253 = zext i64 %1251 to i128
  %1254 = mul nuw i128 %1253, %1252
  %1255 = lshr i128 %1254, 64
  %1256 = trunc nuw i128 %1255 to i64
  %1257 = mul i64 %1235, %1256
  %1258 = sub i64 %1240, %1257
  %1259 = icmp ult i64 %1258, %1235
  %1260 = select i1 %1259, i64 0, i64 %1235
  %1261 = sub i64 %1258, %1260
  %1262 = add i64 %1261, %1250
  %1263 = icmp ult i64 %1262, %1235
  %1264 = select i1 %1263, i64 0, i64 %1235
  %1265 = sub i64 %1262, %1264
  %1266 = load i64, ptr %1102, align 8, !tbaa !782, !noalias !834
  %1267 = load i64, ptr %1216, align 8, !tbaa !782, !noalias !834
  %1268 = zext i64 %1265 to i128
  %1269 = zext i64 %1267 to i128
  %1270 = mul nuw i128 %1268, %1269
  %1271 = lshr i128 %1270, 64
  %1272 = trunc nuw i128 %1271 to i64
  %1273 = mul i64 %1265, %1266
  %1274 = mul i64 %1235, %1272
  %1275 = sub i64 %1273, %1274
  %1276 = icmp ult i64 %1275, %1235
  %1277 = select i1 %1276, i64 0, i64 %1235
  %1278 = sub i64 %1275, %1277
  store i64 %1278, ptr %1223, align 8, !tbaa !782, !noalias !834
  %1279 = add i64 %1220, 8
  br label %1219, !llvm.loop !840

; Exit blocks
1280:                                             ; preds = %1226
  br label %1281
```

https://github.com/llvm/llvm-project/pull/201970


More information about the llvm-commits mailing list