[PATCH] D42230: [CGP] Fix the GV handling in complex addressing mode
Serguei Katkov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 23 04:11:32 PST 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL323192: [CGP] Fix the GV handling in complex addressing mode (authored by skatkov, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D42230?vs=130828&id=131040#toc
Repository:
rL LLVM
https://reviews.llvm.org/D42230
Files:
llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-select.ll
Index: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
+++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
@@ -2694,26 +2694,32 @@
else if (DifferentField != ThisDifferentField)
DifferentField = ExtAddrMode::MultipleFields;
- // If NewAddrMode differs in only one dimension, and that dimension isn't
- // the amount that ScaledReg is scaled by, then we can handle it by
- // inserting a phi/select later on. Even if NewAddMode is the same
- // we still need to collect it due to original value is different.
- // And later we will need all original values as anchors during
- // finding the common Phi node.
+ // If NewAddrMode differs in more than one dimension we cannot handle it.
+ bool CanHandle = DifferentField != ExtAddrMode::MultipleFields;
+
+ // If Scale Field is different then we reject.
+ CanHandle = CanHandle && DifferentField != ExtAddrMode::ScaleField;
+
// We also must reject the case when base offset is different and
// scale reg is not null, we cannot handle this case due to merge of
// different offsets will be used as ScaleReg.
- if (DifferentField != ExtAddrMode::MultipleFields &&
- DifferentField != ExtAddrMode::ScaleField &&
- (DifferentField != ExtAddrMode::BaseOffsField ||
- !NewAddrMode.ScaledReg)) {
+ CanHandle = CanHandle && (DifferentField != ExtAddrMode::BaseOffsField ||
+ !NewAddrMode.ScaledReg);
+
+ // We also must reject the case when GV is different and BaseReg installed
+ // due to we want to use base reg as a merge of GV values.
+ CanHandle = CanHandle && (DifferentField != ExtAddrMode::BaseGVField ||
+ !NewAddrMode.HasBaseReg);
+
+ // Even if NewAddMode is the same we still need to collect it due to
+ // original value is different. And later we will need all original values
+ // as anchors during finding the common Phi node.
+ if (CanHandle)
AddrModes.emplace_back(NewAddrMode);
- return true;
- }
+ else
+ AddrModes.clear();
- // We couldn't combine NewAddrMode with the rest, so return failure.
- AddrModes.clear();
- return false;
+ return CanHandle;
}
/// \brief Combine the addressing modes we've collected into a single
Index: llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-select.ll
===================================================================
--- llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-select.ll
+++ llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-select.ll
@@ -17,3 +17,18 @@
ret i64 %v
}
+ at gv1 = external global i8, align 16
+ at gv2 = external global i8, align 16
+
+; Select when both GV and base reg are present.
+define i8 @test2(i1 %c, i64 %b) {
+; CHECK-LABEL: @test2
+entry:
+; CHECK-LABEL: entry:
+ %g1 = getelementptr inbounds i8, i8* @gv1, i64 %b
+ %g2 = getelementptr inbounds i8, i8* @gv2, i64 %b
+ %s = select i1 %c, i8* %g1, i8* %g2
+; CHECK-NOT: sunkaddr
+ %v = load i8 , i8* %s, align 8
+ ret i8 %v
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42230.131040.patch
Type: text/x-patch
Size: 3161 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180123/ee6bc053/attachment.bin>
More information about the llvm-commits
mailing list