Skip to content

Commit 67a0604

Browse files
committed
Address review
1 parent 27e462a commit 67a0604

File tree

4 files changed

+268
-7
lines changed

4 files changed

+268
-7
lines changed

llvm/include/llvm/CodeGen/BasicTTIImpl.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3265,7 +3265,9 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
32653265
TTI::TargetCostKind CostKind) const override {
32663266
// Without any native support, this is equivalent to the cost of
32673267
// vecreduce.add(mul(ext(Ty A), ext(Ty B))) or
3268-
// vecreduce.add(mul(A, B)). IsNegated determines if the mul is negated.
3268+
// vecreduce.add(mul(A, B)).
3269+
assert((RedOpcode == Instruction::Add || RedOpcode == Instruction::Sub) &&
3270+
"The reduction opcode is expected to be Add or Sub.");
32693271
VectorType *ExtTy = VectorType::get(ResTy, Ty);
32703272
InstructionCost RedCost = thisT()->getArithmeticReductionCost(
32713273
RedOpcode, ExtTy, std::nullopt, CostKind);

llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5489,12 +5489,11 @@ InstructionCost
54895489
AArch64TTIImpl::getMulAccReductionCost(bool IsUnsigned, unsigned RedOpcode,
54905490
Type *ResTy, VectorType *VecTy,
54915491
TTI::TargetCostKind CostKind) const {
5492-
if (RedOpcode != Instruction::Add)
5493-
return InstructionCost::getInvalid(CostKind);
54945492
EVT VecVT = TLI->getValueType(DL, VecTy);
54955493
EVT ResVT = TLI->getValueType(DL, ResTy);
54965494

5497-
if (ST->hasDotProd() && VecVT.isSimple() && ResVT.isSimple()) {
5495+
if (ST->hasDotProd() && VecVT.isSimple() && ResVT.isSimple() &&
5496+
RedOpcode == Instruction::Add) {
54985497
std::pair<InstructionCost, MVT> LT = getTypeLegalizationCost(VecTy);
54995498

55005499
// The legal cases with dotprod are

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3186,15 +3186,14 @@ tryToMatchAndCreateMulAccumulateReduction(VPReductionRecipe *Red,
31863186
};
31873187

31883188
VPValue *VecOp = Red->getVecOp();
3189-
VPValue *Mul = VecOp;
31903189
VPValue *A, *B;
31913190
// Try to match reduce.add(mul(...)).
3192-
if (match(Mul, m_Mul(m_VPValue(A), m_VPValue(B)))) {
3191+
if (match(VecOp, m_Mul(m_VPValue(A), m_VPValue(B)))) {
31933192
auto *RecipeA =
31943193
dyn_cast_if_present<VPWidenCastRecipe>(A->getDefiningRecipe());
31953194
auto *RecipeB =
31963195
dyn_cast_if_present<VPWidenCastRecipe>(B->getDefiningRecipe());
3197-
auto *MulR = cast<VPWidenRecipe>(Mul->getDefiningRecipe());
3196+
auto *MulR = cast<VPWidenRecipe>(VecOp->getDefiningRecipe());
31983197

31993198
// Match reduce.add(mul(ext, ext)).
32003199
if (RecipeA && RecipeB &&

llvm/test/Transforms/SLPVectorizer/AArch64/vecreduceadd.ll

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,3 +1149,264 @@ entry:
11491149
%add.15 = add nsw i32 %mul.15, %add.14
11501150
ret i32 %add.15
11511151
}
1152+
1153+
; COST-LABEL: Function: mla_v16i8_i32_sub
1154+
; COST: Cost: '-2'
1155+
define i32 @mla_v16i8_i32_sub(ptr %x, ptr %y) "target-features"="+dotprod" {
1156+
; CHECK-LABEL: @mla_v16i8_i32_sub(
1157+
; CHECK-NEXT: entry:
1158+
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[X:%.*]], align 1
1159+
; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP0]] to i32
1160+
; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[Y:%.*]], align 1
1161+
; CHECK-NEXT: [[CONV3:%.*]] = sext i8 [[TMP1]] to i32
1162+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[CONV3]], [[CONV]]
1163+
; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 1
1164+
; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ARRAYIDX_1]], align 1
1165+
; CHECK-NEXT: [[CONV_1:%.*]] = sext i8 [[TMP2]] to i32
1166+
; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 1
1167+
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX2_1]], align 1
1168+
; CHECK-NEXT: [[CONV3_1:%.*]] = sext i8 [[TMP3]] to i32
1169+
; CHECK-NEXT: [[MUL_1:%.*]] = mul nsw i32 [[CONV3_1]], [[CONV_1]]
1170+
; CHECK-NEXT: [[SUB_1:%.*]] = sub nsw i32 [[MUL_1]], [[MUL]]
1171+
; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 2
1172+
; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[ARRAYIDX_2]], align 1
1173+
; CHECK-NEXT: [[CONV_2:%.*]] = sext i8 [[TMP4]] to i32
1174+
; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 2
1175+
; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[ARRAYIDX2_2]], align 1
1176+
; CHECK-NEXT: [[CONV3_2:%.*]] = sext i8 [[TMP5]] to i32
1177+
; CHECK-NEXT: [[MUL_2:%.*]] = mul nsw i32 [[CONV3_2]], [[CONV_2]]
1178+
; CHECK-NEXT: [[SUB_2:%.*]] = sub nsw i32 [[MUL_2]], [[SUB_1]]
1179+
; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 3
1180+
; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[ARRAYIDX_3]], align 1
1181+
; CHECK-NEXT: [[CONV_3:%.*]] = sext i8 [[TMP6]] to i32
1182+
; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 3
1183+
; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[ARRAYIDX2_3]], align 1
1184+
; CHECK-NEXT: [[CONV3_3:%.*]] = sext i8 [[TMP7]] to i32
1185+
; CHECK-NEXT: [[MUL_3:%.*]] = mul nsw i32 [[CONV3_3]], [[CONV_3]]
1186+
; CHECK-NEXT: [[SUB_3:%.*]] = sub nsw i32 [[MUL_3]], [[SUB_2]]
1187+
; CHECK-NEXT: [[ARRAYIDX_4:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 4
1188+
; CHECK-NEXT: [[TMP8:%.*]] = load i8, ptr [[ARRAYIDX_4]], align 1
1189+
; CHECK-NEXT: [[CONV_4:%.*]] = sext i8 [[TMP8]] to i32
1190+
; CHECK-NEXT: [[ARRAYIDX2_4:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 4
1191+
; CHECK-NEXT: [[TMP9:%.*]] = load i8, ptr [[ARRAYIDX2_4]], align 1
1192+
; CHECK-NEXT: [[CONV3_4:%.*]] = sext i8 [[TMP9]] to i32
1193+
; CHECK-NEXT: [[MUL_4:%.*]] = mul nsw i32 [[CONV3_4]], [[CONV_4]]
1194+
; CHECK-NEXT: [[SUB_4:%.*]] = sub nsw i32 [[MUL_4]], [[SUB_3]]
1195+
; CHECK-NEXT: [[ARRAYIDX_5:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 5
1196+
; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[ARRAYIDX_5]], align 1
1197+
; CHECK-NEXT: [[CONV_5:%.*]] = sext i8 [[TMP10]] to i32
1198+
; CHECK-NEXT: [[ARRAYIDX2_5:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 5
1199+
; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[ARRAYIDX2_5]], align 1
1200+
; CHECK-NEXT: [[CONV3_5:%.*]] = sext i8 [[TMP11]] to i32
1201+
; CHECK-NEXT: [[MUL_5:%.*]] = mul nsw i32 [[CONV3_5]], [[CONV_5]]
1202+
; CHECK-NEXT: [[SUB_5:%.*]] = sub nsw i32 [[MUL_5]], [[SUB_4]]
1203+
; CHECK-NEXT: [[ARRAYIDX_6:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 6
1204+
; CHECK-NEXT: [[TMP12:%.*]] = load i8, ptr [[ARRAYIDX_6]], align 1
1205+
; CHECK-NEXT: [[CONV_6:%.*]] = sext i8 [[TMP12]] to i32
1206+
; CHECK-NEXT: [[ARRAYIDX2_6:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 6
1207+
; CHECK-NEXT: [[TMP13:%.*]] = load i8, ptr [[ARRAYIDX2_6]], align 1
1208+
; CHECK-NEXT: [[CONV3_6:%.*]] = sext i8 [[TMP13]] to i32
1209+
; CHECK-NEXT: [[MUL_6:%.*]] = mul nsw i32 [[CONV3_6]], [[CONV_6]]
1210+
; CHECK-NEXT: [[SUB_6:%.*]] = sub nsw i32 [[MUL_6]], [[SUB_5]]
1211+
; CHECK-NEXT: [[ARRAYIDX_7:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 7
1212+
; CHECK-NEXT: [[TMP14:%.*]] = load i8, ptr [[ARRAYIDX_7]], align 1
1213+
; CHECK-NEXT: [[CONV_7:%.*]] = sext i8 [[TMP14]] to i32
1214+
; CHECK-NEXT: [[ARRAYIDX2_7:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 7
1215+
; CHECK-NEXT: [[TMP15:%.*]] = load i8, ptr [[ARRAYIDX2_7]], align 1
1216+
; CHECK-NEXT: [[CONV3_7:%.*]] = sext i8 [[TMP15]] to i32
1217+
; CHECK-NEXT: [[MUL_7:%.*]] = mul nsw i32 [[CONV3_7]], [[CONV_7]]
1218+
; CHECK-NEXT: [[SUB_7:%.*]] = sub nsw i32 [[MUL_7]], [[SUB_6]]
1219+
; CHECK-NEXT: [[ARRAYIDX_8:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 8
1220+
; CHECK-NEXT: [[TMP16:%.*]] = load i8, ptr [[ARRAYIDX_8]], align 1
1221+
; CHECK-NEXT: [[CONV_8:%.*]] = sext i8 [[TMP16]] to i32
1222+
; CHECK-NEXT: [[ARRAYIDX2_8:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 8
1223+
; CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr [[ARRAYIDX2_8]], align 1
1224+
; CHECK-NEXT: [[CONV3_8:%.*]] = sext i8 [[TMP17]] to i32
1225+
; CHECK-NEXT: [[MUL_8:%.*]] = mul nsw i32 [[CONV3_8]], [[CONV_8]]
1226+
; CHECK-NEXT: [[SUB_8:%.*]] = sub nsw i32 [[MUL_8]], [[SUB_7]]
1227+
; CHECK-NEXT: [[ARRAYIDX_9:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 9
1228+
; CHECK-NEXT: [[TMP18:%.*]] = load i8, ptr [[ARRAYIDX_9]], align 1
1229+
; CHECK-NEXT: [[CONV_9:%.*]] = sext i8 [[TMP18]] to i32
1230+
; CHECK-NEXT: [[ARRAYIDX2_9:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 9
1231+
; CHECK-NEXT: [[TMP19:%.*]] = load i8, ptr [[ARRAYIDX2_9]], align 1
1232+
; CHECK-NEXT: [[CONV3_9:%.*]] = sext i8 [[TMP19]] to i32
1233+
; CHECK-NEXT: [[MUL_9:%.*]] = mul nsw i32 [[CONV3_9]], [[CONV_9]]
1234+
; CHECK-NEXT: [[SUB_9:%.*]] = sub nsw i32 [[MUL_9]], [[SUB_8]]
1235+
; CHECK-NEXT: [[ARRAYIDX_10:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 10
1236+
; CHECK-NEXT: [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX_10]], align 1
1237+
; CHECK-NEXT: [[CONV_10:%.*]] = sext i8 [[TMP20]] to i32
1238+
; CHECK-NEXT: [[ARRAYIDX2_10:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 10
1239+
; CHECK-NEXT: [[TMP21:%.*]] = load i8, ptr [[ARRAYIDX2_10]], align 1
1240+
; CHECK-NEXT: [[CONV3_10:%.*]] = sext i8 [[TMP21]] to i32
1241+
; CHECK-NEXT: [[MUL_10:%.*]] = mul nsw i32 [[CONV3_10]], [[CONV_10]]
1242+
; CHECK-NEXT: [[SUB_10:%.*]] = sub nsw i32 [[MUL_10]], [[SUB_9]]
1243+
; CHECK-NEXT: [[ARRAYIDX_11:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 11
1244+
; CHECK-NEXT: [[TMP22:%.*]] = load i8, ptr [[ARRAYIDX_11]], align 1
1245+
; CHECK-NEXT: [[CONV_11:%.*]] = sext i8 [[TMP22]] to i32
1246+
; CHECK-NEXT: [[ARRAYIDX2_11:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 11
1247+
; CHECK-NEXT: [[TMP23:%.*]] = load i8, ptr [[ARRAYIDX2_11]], align 1
1248+
; CHECK-NEXT: [[CONV3_11:%.*]] = sext i8 [[TMP23]] to i32
1249+
; CHECK-NEXT: [[MUL_11:%.*]] = mul nsw i32 [[CONV3_11]], [[CONV_11]]
1250+
; CHECK-NEXT: [[SUB_11:%.*]] = sub nsw i32 [[MUL_11]], [[SUB_10]]
1251+
; CHECK-NEXT: [[ARRAYIDX_12:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 12
1252+
; CHECK-NEXT: [[TMP24:%.*]] = load i8, ptr [[ARRAYIDX_12]], align 1
1253+
; CHECK-NEXT: [[CONV_12:%.*]] = sext i8 [[TMP24]] to i32
1254+
; CHECK-NEXT: [[ARRAYIDX2_12:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 12
1255+
; CHECK-NEXT: [[TMP25:%.*]] = load i8, ptr [[ARRAYIDX2_12]], align 1
1256+
; CHECK-NEXT: [[CONV3_12:%.*]] = sext i8 [[TMP25]] to i32
1257+
; CHECK-NEXT: [[MUL_12:%.*]] = mul nsw i32 [[CONV3_12]], [[CONV_12]]
1258+
; CHECK-NEXT: [[SUB_12:%.*]] = sub nsw i32 [[MUL_12]], [[SUB_11]]
1259+
; CHECK-NEXT: [[ARRAYIDX_13:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 13
1260+
; CHECK-NEXT: [[TMP26:%.*]] = load i8, ptr [[ARRAYIDX_13]], align 1
1261+
; CHECK-NEXT: [[CONV_13:%.*]] = sext i8 [[TMP26]] to i32
1262+
; CHECK-NEXT: [[ARRAYIDX2_13:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 13
1263+
; CHECK-NEXT: [[TMP27:%.*]] = load i8, ptr [[ARRAYIDX2_13]], align 1
1264+
; CHECK-NEXT: [[CONV3_13:%.*]] = sext i8 [[TMP27]] to i32
1265+
; CHECK-NEXT: [[MUL_13:%.*]] = mul nsw i32 [[CONV3_13]], [[CONV_13]]
1266+
; CHECK-NEXT: [[SUB_13:%.*]] = sub nsw i32 [[MUL_13]], [[SUB_12]]
1267+
; CHECK-NEXT: [[ARRAYIDX_14:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 14
1268+
; CHECK-NEXT: [[TMP28:%.*]] = load i8, ptr [[ARRAYIDX_14]], align 1
1269+
; CHECK-NEXT: [[CONV_14:%.*]] = sext i8 [[TMP28]] to i32
1270+
; CHECK-NEXT: [[ARRAYIDX2_14:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 14
1271+
; CHECK-NEXT: [[TMP29:%.*]] = load i8, ptr [[ARRAYIDX2_14]], align 1
1272+
; CHECK-NEXT: [[CONV3_14:%.*]] = sext i8 [[TMP29]] to i32
1273+
; CHECK-NEXT: [[MUL_14:%.*]] = mul nsw i32 [[CONV3_14]], [[CONV_14]]
1274+
; CHECK-NEXT: [[SUB_14:%.*]] = sub nsw i32 [[MUL_14]], [[SUB_13]]
1275+
; CHECK-NEXT: [[ARRAYIDX_15:%.*]] = getelementptr inbounds nuw i8, ptr [[X]], i64 15
1276+
; CHECK-NEXT: [[TMP30:%.*]] = load i8, ptr [[ARRAYIDX_15]], align 1
1277+
; CHECK-NEXT: [[CONV_15:%.*]] = sext i8 [[TMP30]] to i32
1278+
; CHECK-NEXT: [[ARRAYIDX2_15:%.*]] = getelementptr inbounds nuw i8, ptr [[Y]], i64 15
1279+
; CHECK-NEXT: [[TMP31:%.*]] = load i8, ptr [[ARRAYIDX2_15]], align 1
1280+
; CHECK-NEXT: [[CONV3_15:%.*]] = sext i8 [[TMP31]] to i32
1281+
; CHECK-NEXT: [[MUL_15:%.*]] = mul nsw i32 [[CONV3_15]], [[CONV_15]]
1282+
; CHECK-NEXT: [[SUB_15:%.*]] = sub nsw i32 [[MUL_15]], [[SUB_14]]
1283+
; CHECK-NEXT: ret i32 [[SUB_15]]
1284+
;
1285+
entry:
1286+
%0 = load i8, ptr %x
1287+
%conv = sext i8 %0 to i32
1288+
%1 = load i8, ptr %y
1289+
%conv3 = sext i8 %1 to i32
1290+
%mul = mul nsw i32 %conv3, %conv
1291+
%arrayidx.1 = getelementptr inbounds nuw i8, ptr %x, i64 1
1292+
%2 = load i8, ptr %arrayidx.1
1293+
%conv.1 = sext i8 %2 to i32
1294+
%arrayidx2.1 = getelementptr inbounds nuw i8, ptr %y, i64 1
1295+
%3 = load i8, ptr %arrayidx2.1
1296+
%conv3.1 = sext i8 %3 to i32
1297+
%mul.1 = mul nsw i32 %conv3.1, %conv.1
1298+
%sub.1 = sub nsw i32 %mul.1, %mul
1299+
%arrayidx.2 = getelementptr inbounds nuw i8, ptr %x, i64 2
1300+
%4 = load i8, ptr %arrayidx.2
1301+
%conv.2 = sext i8 %4 to i32
1302+
%arrayidx2.2 = getelementptr inbounds nuw i8, ptr %y, i64 2
1303+
%5 = load i8, ptr %arrayidx2.2
1304+
%conv3.2 = sext i8 %5 to i32
1305+
%mul.2 = mul nsw i32 %conv3.2, %conv.2
1306+
%sub.2 = sub nsw i32 %mul.2, %sub.1
1307+
%arrayidx.3 = getelementptr inbounds nuw i8, ptr %x, i64 3
1308+
%6 = load i8, ptr %arrayidx.3
1309+
%conv.3 = sext i8 %6 to i32
1310+
%arrayidx2.3 = getelementptr inbounds nuw i8, ptr %y, i64 3
1311+
%7 = load i8, ptr %arrayidx2.3
1312+
%conv3.3 = sext i8 %7 to i32
1313+
%mul.3 = mul nsw i32 %conv3.3, %conv.3
1314+
%sub.3 = sub nsw i32 %mul.3, %sub.2
1315+
%arrayidx.4 = getelementptr inbounds nuw i8, ptr %x, i64 4
1316+
%8 = load i8, ptr %arrayidx.4
1317+
%conv.4 = sext i8 %8 to i32
1318+
%arrayidx2.4 = getelementptr inbounds nuw i8, ptr %y, i64 4
1319+
%9 = load i8, ptr %arrayidx2.4
1320+
%conv3.4 = sext i8 %9 to i32
1321+
%mul.4 = mul nsw i32 %conv3.4, %conv.4
1322+
%sub.4 = sub nsw i32 %mul.4, %sub.3
1323+
%arrayidx.5 = getelementptr inbounds nuw i8, ptr %x, i64 5
1324+
%10 = load i8, ptr %arrayidx.5
1325+
%conv.5 = sext i8 %10 to i32
1326+
%arrayidx2.5 = getelementptr inbounds nuw i8, ptr %y, i64 5
1327+
%11 = load i8, ptr %arrayidx2.5
1328+
%conv3.5 = sext i8 %11 to i32
1329+
%mul.5 = mul nsw i32 %conv3.5, %conv.5
1330+
%sub.5 = sub nsw i32 %mul.5, %sub.4
1331+
%arrayidx.6 = getelementptr inbounds nuw i8, ptr %x, i64 6
1332+
%12 = load i8, ptr %arrayidx.6
1333+
%conv.6 = sext i8 %12 to i32
1334+
%arrayidx2.6 = getelementptr inbounds nuw i8, ptr %y, i64 6
1335+
%13 = load i8, ptr %arrayidx2.6
1336+
%conv3.6 = sext i8 %13 to i32
1337+
%mul.6 = mul nsw i32 %conv3.6, %conv.6
1338+
%sub.6 = sub nsw i32 %mul.6, %sub.5
1339+
%arrayidx.7 = getelementptr inbounds nuw i8, ptr %x, i64 7
1340+
%14 = load i8, ptr %arrayidx.7
1341+
%conv.7 = sext i8 %14 to i32
1342+
%arrayidx2.7 = getelementptr inbounds nuw i8, ptr %y, i64 7
1343+
%15 = load i8, ptr %arrayidx2.7
1344+
%conv3.7 = sext i8 %15 to i32
1345+
%mul.7 = mul nsw i32 %conv3.7, %conv.7
1346+
%sub.7 = sub nsw i32 %mul.7, %sub.6
1347+
%arrayidx.8 = getelementptr inbounds nuw i8, ptr %x, i64 8
1348+
%16 = load i8, ptr %arrayidx.8
1349+
%conv.8 = sext i8 %16 to i32
1350+
%arrayidx2.8 = getelementptr inbounds nuw i8, ptr %y, i64 8
1351+
%17 = load i8, ptr %arrayidx2.8
1352+
%conv3.8 = sext i8 %17 to i32
1353+
%mul.8 = mul nsw i32 %conv3.8, %conv.8
1354+
%sub.8 = sub nsw i32 %mul.8, %sub.7
1355+
%arrayidx.9 = getelementptr inbounds nuw i8, ptr %x, i64 9
1356+
%18 = load i8, ptr %arrayidx.9
1357+
%conv.9 = sext i8 %18 to i32
1358+
%arrayidx2.9 = getelementptr inbounds nuw i8, ptr %y, i64 9
1359+
%19 = load i8, ptr %arrayidx2.9
1360+
%conv3.9 = sext i8 %19 to i32
1361+
%mul.9 = mul nsw i32 %conv3.9, %conv.9
1362+
%sub.9 = sub nsw i32 %mul.9, %sub.8
1363+
%arrayidx.10 = getelementptr inbounds nuw i8, ptr %x, i64 10
1364+
%20 = load i8, ptr %arrayidx.10
1365+
%conv.10 = sext i8 %20 to i32
1366+
%arrayidx2.10 = getelementptr inbounds nuw i8, ptr %y, i64 10
1367+
%21 = load i8, ptr %arrayidx2.10
1368+
%conv3.10 = sext i8 %21 to i32
1369+
%mul.10 = mul nsw i32 %conv3.10, %conv.10
1370+
%sub.10 = sub nsw i32 %mul.10, %sub.9
1371+
%arrayidx.11 = getelementptr inbounds nuw i8, ptr %x, i64 11
1372+
%22 = load i8, ptr %arrayidx.11
1373+
%conv.11 = sext i8 %22 to i32
1374+
%arrayidx2.11 = getelementptr inbounds nuw i8, ptr %y, i64 11
1375+
%23 = load i8, ptr %arrayidx2.11
1376+
%conv3.11 = sext i8 %23 to i32
1377+
%mul.11 = mul nsw i32 %conv3.11, %conv.11
1378+
%sub.11 = sub nsw i32 %mul.11, %sub.10
1379+
%arrayidx.12 = getelementptr inbounds nuw i8, ptr %x, i64 12
1380+
%24 = load i8, ptr %arrayidx.12
1381+
%conv.12 = sext i8 %24 to i32
1382+
%arrayidx2.12 = getelementptr inbounds nuw i8, ptr %y, i64 12
1383+
%25 = load i8, ptr %arrayidx2.12
1384+
%conv3.12 = sext i8 %25 to i32
1385+
%mul.12 = mul nsw i32 %conv3.12, %conv.12
1386+
%sub.12 = sub nsw i32 %mul.12, %sub.11
1387+
%arrayidx.13 = getelementptr inbounds nuw i8, ptr %x, i64 13
1388+
%26 = load i8, ptr %arrayidx.13
1389+
%conv.13 = sext i8 %26 to i32
1390+
%arrayidx2.13 = getelementptr inbounds nuw i8, ptr %y, i64 13
1391+
%27 = load i8, ptr %arrayidx2.13
1392+
%conv3.13 = sext i8 %27 to i32
1393+
%mul.13 = mul nsw i32 %conv3.13, %conv.13
1394+
%sub.13 = sub nsw i32 %mul.13, %sub.12
1395+
%arrayidx.14 = getelementptr inbounds nuw i8, ptr %x, i64 14
1396+
%28 = load i8, ptr %arrayidx.14
1397+
%conv.14 = sext i8 %28 to i32
1398+
%arrayidx2.14 = getelementptr inbounds nuw i8, ptr %y, i64 14
1399+
%29 = load i8, ptr %arrayidx2.14
1400+
%conv3.14 = sext i8 %29 to i32
1401+
%mul.14 = mul nsw i32 %conv3.14, %conv.14
1402+
%sub.14 = sub nsw i32 %mul.14, %sub.13
1403+
%arrayidx.15 = getelementptr inbounds nuw i8, ptr %x, i64 15
1404+
%30 = load i8, ptr %arrayidx.15
1405+
%conv.15 = sext i8 %30 to i32
1406+
%arrayidx2.15 = getelementptr inbounds nuw i8, ptr %y, i64 15
1407+
%31 = load i8, ptr %arrayidx2.15
1408+
%conv3.15 = sext i8 %31 to i32
1409+
%mul.15 = mul nsw i32 %conv3.15, %conv.15
1410+
%sub.15 = sub nsw i32 %mul.15, %sub.14
1411+
ret i32 %sub.15
1412+
}

0 commit comments

Comments
 (0)