From c43b20a43b3386bb87635f78b39fcb0680b83389 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. llvm-svn: 296332 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 34be7766b575..26cb3a69cf6e 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/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