[llvm] [Codegen][LegalizeIntegerTypes] Improve shift through stack (PR #96151)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 2 07:05:53 PDT 2024


================
@@ -4530,14 +4530,35 @@ void DAGTypeLegalizer::ExpandIntRes_ShiftThroughStack(SDNode *N, SDValue &Lo,
   SDValue ShAmt = N->getOperand(1);
   EVT ShAmtVT = ShAmt.getValueType();
 
-  // This legalization is optimal when the shift is by a multiple of byte width,
-  //   %x * 8 <-> %x << 3   so 3 low bits should be be known zero.
-  bool ShiftByByteMultiple =
-      DAG.computeKnownBits(ShAmt).countMinTrailingZeros() >= 3;
+  EVT LoadStoreVT = VT;
+  do {
+    LoadStoreVT = TLI.getTypeToTransformTo(*DAG.getContext(), LoadStoreVT);
+  } while (!TLI.isTypeLegal(LoadStoreVT));
+
+  const unsigned KnownTrailingZeros =
+      DAG.computeKnownBits(ShAmt).countMinTrailingZeros();
+
+  const Align LoadStoreAlign = [&]() -> Align {
+    unsigned IsFast = 0;
+    const bool AllowsFastMisalignedMemoryAccesses =
+        TLI.allowsMisalignedMemoryAccesses(
+            LoadStoreVT, /*AddrSpace=*/DAG.getDataLayout().getAllocaAddrSpace(),
+            /*Alignment=*/Align(LoadStoreVT.getStoreSize()),
----------------
arsenm wrote:

If you're going to use the natural alignment, it doesn't make sense to call TLI.allowsMisalignedMemoryAccesses in the first place. You would need to pull this from the value you are going to create the actual load/store with 

https://github.com/llvm/llvm-project/pull/96151


More information about the llvm-commits mailing list