From f85432589bb013281b8b51899738f6e6ad4fb4a7 Mon Sep 17 00:00:00 2001 From: Artur Pilipenko Date: Mon, 27 Feb 2017 11:42:54 +0000 Subject: [PATCH] [DAGCombine] NFC. MatchLoadCombine extract MemoryByteOffset lambda helper This refactoring will simplify the upcoming change to fix the bug in folding patterns with non-zero offsets on BE targets. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296332 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 34be7766b57..26cb3a69cf6 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4516,6 +4516,18 @@ SDValue DAGCombiner::MatchLoadCombine(SDNode *N) { std::function BigEndianByteAt = []( unsigned BW, unsigned i) { return BW - i - 1; }; + bool IsBigEndianTarget = DAG.getDataLayout().isBigEndian(); + auto MemoryByteOffset = [&] (ByteProvider P) { + assert(P.isMemory() && "Must be a memory byte provider"); + unsigned LoadBitWidth = P.Load->getMemoryVT().getSizeInBits(); + assert(LoadBitWidth % 8 == 0 && + "can only analyze providers for individual bytes not bit"); + unsigned LoadByteWidth = LoadBitWidth / 8; + return IsBigEndianTarget + ? BigEndianByteAt(LoadByteWidth, P.ByteOffset) + : LittleEndianByteAt(LoadByteWidth, P.ByteOffset); + }; + Optional Base; SDValue Chain; @@ -4523,9 +4535,6 @@ SDValue DAGCombiner::MatchLoadCombine(SDNode *N) { Optional FirstByteProvider; int64_t FirstOffset = INT64_MAX; - bool IsBigEndianTarget = DAG.getDataLayout().isBigEndian(); - auto ByteAt = IsBigEndianTarget ? BigEndianByteAt : LittleEndianByteAt; - // Check if all the bytes of the OR we are looking at are loaded from the same // base address. Collect bytes offsets from Base address in ByteOffsets. SmallVector ByteOffsets(ByteWidth); @@ -4555,12 +4564,7 @@ SDValue DAGCombiner::MatchLoadCombine(SDNode *N) { return SDValue(); // Calculate the offset of the current byte from the base address - unsigned LoadBitWidth = L->getMemoryVT().getSizeInBits(); - assert(LoadBitWidth % 8 == 0 && - "can only analyze providers for individual bytes not bit"); - unsigned LoadByteWidth = LoadBitWidth / 8; - int64_t MemoryByteOffset = ByteAt(LoadByteWidth, P->ByteOffset); - int64_t ByteOffsetFromBase = Ptr.Offset + MemoryByteOffset; + int64_t ByteOffsetFromBase = Ptr.Offset + MemoryByteOffset(*P); ByteOffsets[i] = ByteOffsetFromBase; // Remember the first byte load -- 2.50.1