[llvm] [AMDGPU] Recognise bitmask operations as srcmods on select (PR #152119)
Stanislav Mekhanoshin via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 6 00:48:16 PDT 2025
================
@@ -3036,6 +3036,44 @@ bool AMDGPUDAGToDAGISel::SelectVOP3ModsImpl(SDValue In, SDValue &Src,
Src = Src.getOperand(0);
}
+ if (Mods != SISrcMods::NONE)
+ return true;
+
+ // Convert various sign-bit masks on integers to src mods. Currently disabled
+ // for 16-bit types as the codegen replaces the operand without adding a
+ // srcmod. This is intentionally finding the cases where we are performing
+ // float neg and abs on int types, the goal is not to obtain two's complement
+ // neg or abs. Limit converison to select operands via the nonCanonalizing
+ // pattern.
+ // TODO: Add 16-bit support.
+ if (IsCanonicalizing)
+ return true;
+
+ unsigned Opc = Src->getOpcode();
+ EVT VT = Src.getValueType();
+ if ((Opc != ISD::AND && Opc != ISD::OR && Opc != ISD::XOR) ||
+ (VT != MVT::i32 && VT != MVT::v2i32 && VT != MVT::i64))
+ return true;
+
+ ConstantSDNode *CRHS = isConstOrConstSplat((Src->getOperand(1)));
----------------
rampitec wrote:
My point was: modifier can flip a single bit. A splat will need to flip 2 bits for each component.
https://github.com/llvm/llvm-project/pull/152119
More information about the llvm-commits
mailing list