[llvm] 03f338e - [AArch64] Ensure we do not access illegal operands in tryCombineMULLWithUZP1
David Green via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 1 06:12:37 PDT 2023
Author: David Green
Date: 2023-09-01T14:12:31+01:00
New Revision: 03f338e7e0d4eb9c5b28f860b89615832d5e6693
URL: https://github.com/llvm/llvm-project/commit/03f338e7e0d4eb9c5b28f860b89615832d5e6693
DIFF: https://github.com/llvm/llvm-project/commit/03f338e7e0d4eb9c5b28f860b89615832d5e6693.diff
LOG: [AArch64] Ensure we do not access illegal operands in tryCombineMULLWithUZP1
https://github.com/llvm/llvm-project/issues/65015 shows a case where
tryCombineMULLWithUZP1 could attempt to look at the wrong operand of another
user instruction. This adds an extra else as if we don't find the right opcode,
we don't need to check the operands.
Differential Revision: https://reviews.llvm.org/D159282
Added:
Modified:
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/test/CodeGen/AArch64/aarch64-smull.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 3e44eabd8a93c8..33d9beed41ff00 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -23017,19 +23017,20 @@ static SDValue tryCombineMULLWithUZP1(SDNode *N,
// Check ExtractLow's user.
if (HasFoundMULLow) {
SDNode *ExtractLowUser = *ExtractLow.getNode()->use_begin();
- if (ExtractLowUser->getOpcode() != N->getOpcode())
+ if (ExtractLowUser->getOpcode() != N->getOpcode()) {
HasFoundMULLow = false;
-
- if (ExtractLowUser->getOperand(0) == ExtractLow) {
- if (ExtractLowUser->getOperand(1).getOpcode() == ISD::TRUNCATE)
- TruncLow = ExtractLowUser->getOperand(1);
- else
- HasFoundMULLow = false;
} else {
- if (ExtractLowUser->getOperand(0).getOpcode() == ISD::TRUNCATE)
- TruncLow = ExtractLowUser->getOperand(0);
- else
- HasFoundMULLow = false;
+ if (ExtractLowUser->getOperand(0) == ExtractLow) {
+ if (ExtractLowUser->getOperand(1).getOpcode() == ISD::TRUNCATE)
+ TruncLow = ExtractLowUser->getOperand(1);
+ else
+ HasFoundMULLow = false;
+ } else {
+ if (ExtractLowUser->getOperand(0).getOpcode() == ISD::TRUNCATE)
+ TruncLow = ExtractLowUser->getOperand(0);
+ else
+ HasFoundMULLow = false;
+ }
}
}
diff --git a/llvm/test/CodeGen/AArch64/aarch64-smull.ll b/llvm/test/CodeGen/AArch64/aarch64-smull.ll
index a490556f1a97ef..c1470239995c99 100644
--- a/llvm/test/CodeGen/AArch64/aarch64-smull.ll
+++ b/llvm/test/CodeGen/AArch64/aarch64-smull.ll
@@ -1330,8 +1330,27 @@ entry:
ret void
}
+define <2 x i32> @do_stuff(<2 x i64> %0, <2 x i64> %1) {
+; CHECK-LABEL: do_stuff:
+; CHECK: // %bb.0:
+; CHECK-NEXT: uzp1 v0.4s, v0.4s, v0.4s
+; CHECK-NEXT: smull2 v0.2d, v1.4s, v0.4s
+; CHECK-NEXT: xtn v0.2s, v0.2d
+; CHECK-NEXT: add v0.2s, v0.2s, v1.2s
+; CHECK-NEXT: ret
+ %bc.1 = bitcast <2 x i64> %1 to <4 x i32>
+ %trunc.0 = trunc <2 x i64> %0 to <2 x i32>
+ %shuff.hi = shufflevector <4 x i32> %bc.1, <4 x i32> zeroinitializer, <2 x i32> <i32 2, i32 3>
+ %shuff.lo = shufflevector <4 x i32> %bc.1, <4 x i32> zeroinitializer, <2 x i32> <i32 0, i32 1>
+ %smull = tail call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %shuff.hi, <2 x i32> %trunc.0)
+ %trunc.smull = trunc <2 x i64> %smull to <2 x i32>
+ %final = add <2 x i32> %trunc.smull, %shuff.lo
+ ret <2 x i32> %final
+}
+
declare <8 x i16> @llvm.aarch64.neon.pmull.v8i16(<8 x i8>, <8 x i8>)
declare <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8>, <8 x i8>)
declare <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8>, <8 x i8>)
declare <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16>, <4 x i16>)
declare <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16>, <4 x i16>)
+declare <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32>, <2 x i32>)
More information about the llvm-commits
mailing list