[llvm] b810b66 - [X86] combineFMulcFCMulc - use KnownBits to detect conjugate patterns.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 22 04:54:34 PST 2023
Author: Simon Pilgrim
Date: 2023-11-22T12:54:14Z
New Revision: b810b668172a25a9ccc716fa216646558f126847
URL: https://github.com/llvm/llvm-project/commit/b810b668172a25a9ccc716fa216646558f126847
DIFF: https://github.com/llvm/llvm-project/commit/b810b668172a25a9ccc716fa216646558f126847.diff
LOG: [X86] combineFMulcFCMulc - use KnownBits to detect conjugate patterns.
We currently look for X86ISD::VBROADCAST_LOAD patterns, but this won't work with a future patch which will improve sharing of constant pool loads.
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 19d6bbcdbc69bcf..05a2ab093bb86f9 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -50824,37 +50824,18 @@ static SDValue combineFMulcFCMulc(SDNode *N, SelectionDAG &DAG,
SDValue RHS = N->getOperand(1);
int CombineOpcode =
N->getOpcode() == X86ISD::VFCMULC ? X86ISD::VFMULC : X86ISD::VFCMULC;
- auto isConjugationConstant = [](const Constant *c) {
- if (const auto *CI = dyn_cast<ConstantInt>(c)) {
- APInt ConjugationInt32 = APInt(32, 0x80000000, true);
- APInt ConjugationInt64 = APInt(64, 0x8000000080000000ULL, true);
- switch (CI->getBitWidth()) {
- case 16:
- return false;
- case 32:
- return CI->getValue() == ConjugationInt32;
- case 64:
- return CI->getValue() == ConjugationInt64;
- default:
- llvm_unreachable("Unexpected bit width");
- }
- }
- if (const auto *CF = dyn_cast<ConstantFP>(c))
- return CF->getType()->isFloatTy() && CF->isNegativeZeroValue();
- return false;
- };
auto combineConjugation = [&](SDValue &r) {
if (LHS->getOpcode() == ISD::BITCAST && RHS.hasOneUse()) {
SDValue XOR = LHS.getOperand(0);
if (XOR->getOpcode() == ISD::XOR && XOR.hasOneUse()) {
- SDValue XORRHS = XOR.getOperand(1);
- if (XORRHS.getOpcode() == ISD::BITCAST && XORRHS.hasOneUse())
- XORRHS = XORRHS.getOperand(0);
- if (XORRHS.getOpcode() == X86ISD::VBROADCAST_LOAD &&
- XORRHS.getOperand(1).getNumOperands()) {
- ConstantPoolSDNode *CP =
- dyn_cast<ConstantPoolSDNode>(XORRHS.getOperand(1).getOperand(0));
- if (CP && isConjugationConstant(CP->getConstVal())) {
+ KnownBits XORRHS = DAG.computeKnownBits(XOR.getOperand(1));
+ if (XORRHS.isConstant()) {
+ APInt ConjugationInt32 = APInt(32, 0x80000000, true);
+ APInt ConjugationInt64 = APInt(64, 0x8000000080000000ULL, true);
+ if ((XORRHS.getBitWidth() == 32 &&
+ XORRHS.getConstant() == ConjugationInt32) ||
+ (XORRHS.getBitWidth() == 64 &&
+ XORRHS.getConstant() == ConjugationInt64)) {
SelectionDAG::FlagInserter FlagsInserter(DAG, N);
SDValue I2F = DAG.getBitcast(VT, LHS.getOperand(0).getOperand(0));
SDValue FCMulC = DAG.getNode(CombineOpcode, SDLoc(N), VT, RHS, I2F);
More information about the llvm-commits
mailing list