[PATCH] D138260: [RISCV] Prevent constant hoisting for (and (shl X, C), mask<<C)
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 17 22:01:06 PST 2022
craig.topper created this revision.
craig.topper added reviewers: reames, asb, luismarques, kito-cheng.
Herald added subscribers: sunshaoce, VincentWu, StephenFan, vkmr, frasercrmck, evandro, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, jrtc27, shiva0217, niosHD, sabuasal, simoncook, johnrusso, rbar, hiraditya, arichardson.
Herald added a reviewer: ributzka.
Herald added a project: All.
craig.topper requested review of this revision.
Herald added subscribers: pcwang-thead, eopXD, MaskRay.
Herald added a project: LLVM.
If the immediate is a shifted mask, we will use a pair of shifts
and never materialize the immediate. Consider the immediate free.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D138260
Files:
llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll
Index: llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll
===================================================================
--- llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll
+++ llvm/test/Transforms/ConstantHoisting/RISCV/immediates.ll
@@ -81,3 +81,17 @@
%2 = mul i64 %1, -4294967296
ret i64 %2
}
+
+define i32 @test10(i32 %a, i32 %b) nounwind {
+; CHECK-LABEL: @test10(
+; CHECK: shl i32 %a, 8
+; CHECK: and i32 %1, 65280
+; CHECK: shl i32 %b, 8
+; CHECK: and i32 %3, 65280
+ %1 = shl i32 %a, 8
+ %2 = and i32 %1, 65280
+ %3 = shl i32 %b, 8
+ %4 = and i32 %3, 65280
+ %5 = mul i32 %2, %4
+ ret i32 %5
+}
Index: llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
+++ llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
@@ -46,6 +46,29 @@
getST()->getFeatureBits());
}
+static bool canUseShiftPair(Instruction *Inst, const APInt &Imm) {
+ uint64_t Mask = Imm.getZExtValue();
+ auto *BO = dyn_cast<BinaryOperator>(Inst->getOperand(0));
+ if (!BO || !BO->hasOneUse())
+ return false;
+
+ if (BO->getOpcode() != Instruction::Shl)
+ return false;
+
+ if (!isa<ConstantInt>(BO->getOperand(1)))
+ return false;
+
+ unsigned ShAmt = cast<ConstantInt>(BO->getOperand(1))->getZExtValue();
+
+ if (isShiftedMask_64(Mask)) {
+ unsigned Trailing = countTrailingZeros(Mask);
+ if (ShAmt == Trailing)
+ return true;
+ }
+
+ return false;
+}
+
InstructionCost RISCVTTIImpl::getIntImmCostInst(unsigned Opcode, unsigned Idx,
const APInt &Imm, Type *Ty,
TTI::TargetCostKind CostKind,
@@ -75,6 +98,9 @@
// zext.w
if (Imm == UINT64_C(0xffffffff) && ST->hasStdExtZba())
return TTI::TCC_Free;
+ if (Inst && Idx == 1 && Imm.getBitWidth() <= ST->getXLen() &&
+ canUseShiftPair(Inst, Imm))
+ return TTI::TCC_Free;
[[fallthrough]];
case Instruction::Add:
case Instruction::Or:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D138260.476335.patch
Type: text/x-patch
Size: 2117 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221118/ced77b37/attachment.bin>
More information about the llvm-commits
mailing list