[llvm] [Codegen][LegalizeIntegerTypes] Improve shift through stack (PR #96151)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 19 01:20:15 PDT 2024
================
@@ -4574,20 +4584,29 @@ void DAGTypeLegalizer::ExpandIntRes_ShiftThroughStack(SDNode *N, SDValue &Lo,
Init = DAG.getNode(ISD::BUILD_PAIR, dl, StackSlotVT, AllZeros, Shiftee);
}
// And spill it into the stack slot.
- Ch = DAG.getStore(Ch, dl, Init, StackPtr, StackPtrInfo, StackSlotAlignment);
+ Ch = DAG.getStore(Ch, dl, Init, StackPtr, StackPtrInfo);
// Now, compute the full-byte offset into stack slot from where we can load.
- // We have shift amount, which is in bits, but in multiples of byte.
- // So just divide by CHAR_BIT.
+ // We have shift amount, which is in bits. Offset should point to an aligned
+ // address.
SDNodeFlags Flags;
- if (ShiftByByteMultiple)
+
+ if (IsOneStepShift)
Flags.setExact(true);
- SDValue ByteOffset = DAG.getNode(ISD::SRL, dl, ShAmtVT, ShAmt,
- DAG.getConstant(3, dl, ShAmtVT), Flags);
+ SDValue SrlTmp = DAG.getNode(
+ ISD::SRL, dl, ShAmtVT, ShAmt,
+ DAG.getConstant(Log2_32(ShiftUnitInBits), dl, ShAmtVT), Flags);
+ SDValue OffsetInBits =
+ DAG.getNode(ISD::SHL, dl, ShAmtVT, SrlTmp,
+ DAG.getConstant(Log2_32(ShiftUnitInBits), dl, ShAmtVT));
+
+ Flags.setExact(true);
+ SDValue Offset = DAG.getNode(ISD::SRL, dl, ShAmtVT, OffsetInBits,
+ DAG.getConstant(3, dl, ShAmtVT), Flags);
----------------
arsenm wrote:
This is a sneaky hardcoded byte size. Is there a way to make it more obvious this is a byte shift?
https://github.com/llvm/llvm-project/pull/96151
More information about the llvm-commits
mailing list