From 2f6186d4a33f643e5f01f2cc1ed017b975046c0f Mon Sep 17 00:00:00 2001 From: Nirav Dave Date: Fri, 22 Feb 2019 16:20:34 +0000 Subject: [PATCH] Disable big-endian constant store merges from rL354676. llvm-svn: 354677 --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 21 +++++++++++---------- test/CodeGen/PowerPC/constant-combines.ll | 12 +++++++----- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index cbaa13c55f5..c118dfffed2 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -15450,16 +15450,17 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) { if (auto *C = dyn_cast(Value)) { APInt Val = C1->getAPIntValue(); APInt InsertVal = C->getAPIntValue().zextOrTrunc(STByteSize * 8); - if (DAG.getDataLayout().isBigEndian()) - Offset = ChainByteSize - 1 - Offset; - Val.insertBits(InsertVal, Offset * 8); - SDValue NewSDVal = - DAG.getConstant(Val, SDLoc(C), ChainValue.getValueType(), - C1->isTargetOpcode(), C1->isOpaque()); - SDNode *NewST1 = DAG.UpdateNodeOperands( - ST1, ST1->getChain(), NewSDVal, ST1->getOperand(2), - ST1->getOperand(3)); - return CombineTo(ST, SDValue(NewST1, 0)); + // FIXME: Handle Big-endian mode. + if (!DAG.getDataLayout().isBigEndian()) { + Val.insertBits(InsertVal, Offset * 8); + SDValue NewSDVal = + DAG.getConstant(Val, SDLoc(C), ChainValue.getValueType(), + C1->isTargetOpcode(), C1->isOpaque()); + SDNode *NewST1 = DAG.UpdateNodeOperands( + ST1, ST1->getChain(), NewSDVal, ST1->getOperand(2), + ST1->getOperand(3)); + return CombineTo(ST, SDValue(NewST1, 0)); + } } } } // End ST subset of ST1 case. diff --git a/test/CodeGen/PowerPC/constant-combines.ll b/test/CodeGen/PowerPC/constant-combines.ll index bd14509e2ef..dd40b75d58f 100644 --- a/test/CodeGen/PowerPC/constant-combines.ll +++ b/test/CodeGen/PowerPC/constant-combines.ll @@ -1,13 +1,14 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -o - %s | FileCheck --check-prefix=BE %s +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -o - %s | FileCheck --check-prefix=BE %s ; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -o - %s | FileCheck --check-prefix=LE %s define void @fold_constant_stores_loaddr(i8* %i8_ptr) { ; BE-LABEL: fold_constant_stores_loaddr: ; BE: # %bb.0: # %entry -; BE-NEXT: li 4, 85 -; BE-NEXT: sldi 4, 4, 57 +; BE-NEXT: li 4, 0 ; BE-NEXT: std 4, 0(3) +; BE-NEXT: li 4, -86 +; BE-NEXT: stb 4, 0(3) ; BE-NEXT: blr ; ; LE-LABEL: fold_constant_stores_loaddr: @@ -26,9 +27,10 @@ entry: define void @fold_constant_stores_hiaddr(i8* %i8_ptr) { ; BE-LABEL: fold_constant_stores_hiaddr: ; BE: # %bb.0: # %entry -; BE-NEXT: li 4, 85 -; BE-NEXT: sldi 4, 4, 57 +; BE-NEXT: li 4, 0 ; BE-NEXT: std 4, 0(3) +; BE-NEXT: li 4, -86 +; BE-NEXT: stb 4, 0(3) ; BE-NEXT: blr ; ; LE-LABEL: fold_constant_stores_hiaddr: