[llvm] [AMDGPU] Rework dot4 signedness checks (PR #68757)
Jeffrey Byrnes via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 26 12:59:49 PDT 2023
================
@@ -12952,30 +12952,51 @@ static bool isMul(const SDValue Op) {
static std::optional<bool> checkSignedness(const SDValue &N,
ByteProvider<SDValue> &Src0,
- ByteProvider<SDValue> &Src1) {
+ ByteProvider<SDValue> &Src1,
+ const SDValue &S1Op,
+ const SDValue &S0Op) {
auto MulOpcode = N.getOpcode();
- std::optional<bool> IterIsSigned;
- // Both sides of the tree must have the same signedness semantics.
- if ((Src0.IsSigned != Src1.IsSigned) ||
- (Src0.IsSigned.value_or(false) != Src1.IsSigned.value_or(false)))
- return IterIsSigned;
- // If we have a MUL_U24 op with signed semantics, then fail.
- if (Src0.IsSigned.value_or(false) && MulOpcode == AMDGPUISD::MUL_U24)
- return IterIsSigned;
- // If we have a MUL_I24 op with unsigned semantics, then fail.
- if (!Src0.IsSigned.value_or(true) && MulOpcode == AMDGPUISD::MUL_I24)
- return IterIsSigned;
-
- bool TopLevelSignedness =
- MulOpcode == AMDGPUISD::MUL_I24 ||
- (MulOpcode == ISD::MUL && N.getNode()->getFlags().hasNoSignedWrap() &&
- !N.getNode()->getFlags().hasNoUnsignedWrap());
-
- // In cases where we are accumulating into an i8 (for v_dot4), the
- // ByteProvider will not have signedness info since the MSBs are dont-cares.
- // In this case, we simply use the TopLevelSignedness of the instruction.
- IterIsSigned = Src0.IsSigned.value_or(TopLevelSignedness);
- return IterIsSigned;
+
+ // We have previously determined the signedness semantics
+ if (MulOpcode == AMDGPUISD::MUL_U24 || MulOpcode == AMDGPUISD::MUL_I24)
+ return MulOpcode == AMDGPUISD::MUL_I24;
----------------
jrbyrnes wrote:
MUL_U24 returns false, signaling that the iteration in the dot4 chain uses zext.
https://github.com/llvm/llvm-project/pull/68757
More information about the llvm-commits
mailing list