[PATCH] D22175: Fix ppcBE break: Avoid instcombine trunc rule for BE layout

Anna Thomas via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 8 14:48:53 PDT 2016

anna created this revision.
anna added a reviewer: reames.
anna added a subscriber: llvm-commits.

This change is to avoid the instcombine rule for BE layout.

store i8 0, i8 *%a, align 2
%bca  = bitcast i8* %a to i16*
%wide.load = load i16, i16* %bca, align 2
%lowhalf.1 = trunc i16 %wide.load to i8  <— trunc feeds directly from a load.

This trunc will be the low half in LE machines. 
To get the same content in BE, we’ll need a shr, followed by trunc. 
So, for a BE machine, we cannot replace the trunc value with 0 (in LE we can do that).



Index: lib/Transforms/InstCombine/InstCombineCasts.cpp
--- lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -577,8 +577,10 @@
     return I;
   // When trunc operand is a widened load, see if we can get the value from a
-  // previous store/load
-  if (auto *LI = dyn_cast<LoadInst>(Src)) {
+  // previous store/load. This rule works for LE layout only. For a BE layout,
+  // we would require a shr and a trunc to refer to same content that an LE
+  // memory layout refers through a trunc.
+  if (DL.isLittleEndian()  && auto *LI = dyn_cast<LoadInst>(Src)) {
     BasicBlock::iterator BBI(*LI);
     // Scan a few instructions up from LI and if we find a partial load/store

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22175.63324.patch
Type: text/x-patch
Size: 802 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160708/d9fa8301/attachment.bin>

More information about the llvm-commits mailing list