[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