[llvm] r343525 - [PowerPC] Folding XForm to DForm loads requires alignment for some DForm loads.

Stefan Pintilie via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 1 13:16:28 PDT 2018


Author: stefanp
Date: Mon Oct  1 13:16:27 2018
New Revision: 343525

URL: http://llvm.org/viewvc/llvm-project?rev=343525&view=rev
Log:
[PowerPC] Folding XForm to DForm loads requires alignment for some DForm loads.

Going from XForm Load to DSForm Load requires that the immediate be 4 byte
aligned.
If we are not aligned we must leave the load as LDX (XForm).
This bug is causing a compile-time failure in the benchmark h264ref.

Differential Revision: https://reviews.llvm.org/D51988

Added:
    llvm/trunk/test/CodeGen/PowerPC/p9-dform-load-alignment.ll
Modified:
    llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp

Modified: llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp?rev=343525&r1=343524&r2=343525&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp Mon Oct  1 13:16:27 2018
@@ -3150,6 +3150,14 @@ bool PPCInstrInfo::isImmElgibleForForwar
        III.TruncateImmTo || III.ImmWidth != 16)
       return false;
 
+    // Going from XForm to DForm loads means that the displacement needs to be
+    // not just an immediate but also a multiple of 4, or 16 depending on the
+    // load. A DForm load cannot be represented if it is a multiple of say 2.
+    // XForm loads do not have this restriction.
+    if (ImmMO.isGlobal() &&
+        ImmMO.getGlobal()->getAlignment() < III.ImmMustBeMultipleOf)
+      return false;
+
     return true;
   }
 

Added: llvm/trunk/test/CodeGen/PowerPC/p9-dform-load-alignment.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/p9-dform-load-alignment.ll?rev=343525&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/p9-dform-load-alignment.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/p9-dform-load-alignment.ll Mon Oct  1 13:16:27 2018
@@ -0,0 +1,16 @@
+; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
+; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names \
+; RUN:   -ppc-vsr-nums-as-vr < %s | FileCheck %s
+
+ at best8x8mode = external dso_local local_unnamed_addr global [4 x i16], align 2
+define dso_local void @AlignDSForm() local_unnamed_addr {
+entry:
+  %0 = load <4 x i16>, <4 x i16>* bitcast ([4 x i16]* @best8x8mode to <4 x i16>*), align 2
+  store <4 x i16> %0, <4 x i16>* undef, align 4
+  unreachable
+; CHECK-LABEL: AlignDSForm
+; CHECK: addis r{{[0-9]+}}, r{{[0-9]+}}, best8x8mode at toc@ha
+; CHECK: addi r[[REG:[0-9]+]], r{{[0-9]+}}, best8x8mode at toc@l
+; CHECK: ldx r{{[0-9]+}}, 0, r[[REG]]
+}
+




More information about the llvm-commits mailing list