[llvm] r347288 - [PowerPC] Don't combine to bswap store on 1-byte truncating store

Nemanja Ivanovic via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 19 20:42:31 PST 2018


Author: nemanjai
Date: Mon Nov 19 20:42:31 2018
New Revision: 347288

URL: http://llvm.org/viewvc/llvm-project?rev=347288&view=rev
Log:
[PowerPC] Don't combine to bswap store on 1-byte truncating store

Turns out that there was no check for a store that truncates down
to a single byte when combining a (store (bswap...)) into a byte-swapping
store. This patch just adds that check.

Fixes https://bugs.llvm.org/show_bug.cgi?id=39478.

Added:
    llvm/trunk/test/CodeGen/PowerPC/pr39478.ll
Modified:
    llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp

Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=347288&r1=347287&r2=347288&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Mon Nov 19 20:42:31 2018
@@ -12604,9 +12604,10 @@ SDValue PPCTargetLowering::PerformDAGCom
         (Op1VT == MVT::i32 || Op1VT == MVT::i16 ||
          (Subtarget.hasLDBRX() && Subtarget.isPPC64() && Op1VT == MVT::i64))) {
 
-      // STBRX can only handle simple types.
+      // STBRX can only handle simple types and it makes no sense to store less
+      // two bytes in byte-reversed order.
       EVT mVT = cast<StoreSDNode>(N)->getMemoryVT();
-      if (mVT.isExtended())
+      if (mVT.isExtended() || mVT.getSizeInBits() < 16)
         break;
 
       SDValue BSwapOp = N->getOperand(1).getOperand(0);

Added: llvm/trunk/test/CodeGen/PowerPC/pr39478.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/pr39478.ll?rev=347288&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/pr39478.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/pr39478.ll Mon Nov 19 20:42:31 2018
@@ -0,0 +1,26 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs < %s | \
+; RUN:   FileCheck %s
+; RUN: llc -mtriple=powerpc64-unknown-unknown -verify-machineinstrs < %s | \
+; RUN:   FileCheck %s
+
+define void @pr39478() {
+; CHECK-LABEL: pr39478:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    lwz 3, 0(3)
+; CHECK-NEXT:    stb 3, 0(3)
+; CHECK-NEXT:    blr
+entry:
+  %tmp32 = load i64, i64* undef, align 8
+  %tmp33 = load i32, i32* undef, align 4
+  %tmp34 = and i32 %tmp33, -256
+  %tmp35 = lshr i64 %tmp32, 32
+  %tmp36 = shl nuw nsw i64 %tmp35, 24
+  %tmp37 = trunc i64 %tmp36 to i32
+  %tmp38 = call i32 @llvm.bswap.i32(i32 %tmp37)
+  %tmp39 = or i32 %tmp38, %tmp34
+  store i32 %tmp39, i32* undef, align 4
+  ret void
+}
+
+declare i32 @llvm.bswap.i32(i32)




More information about the llvm-commits mailing list