[PATCH] D57616: [DAGCombiner] Discard pointer info when combining extract_vector_elt of a vector load when the index isn't constant
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 4 14:25:26 PST 2019
craig.topper updated this revision to Diff 185160.
craig.topper added a comment.
Add test cases with MIR output to show that the pointer info except for addr space is discarded on the variable index case, but not the constant index case.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D57616/new/
https://reviews.llvm.org/D57616
Files:
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/vecloadextract.ll
Index: test/CodeGen/X86/vecloadextract.ll
===================================================================
--- /dev/null
+++ test/CodeGen/X86/vecloadextract.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+;RUN: llc < %s -mtriple=i686 -mattr=sse4.1 -stop-after=expand-isel-pseudos 2>&1 | FileCheck %s
+
+; This test makes sure we discard pointer info when we combine a vector load
+; and a variable extractelement into a scalar load using an index. There's also
+; a test to ensure we don't discard it for the constant index case.
+
+; CHECK: name: const_index
+; CHECK: bb.0 (%ir-block.0):
+; CHECK: [[POINTER:%[0-9]+]]:gr32 = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (load 4 from %fixed-stack.0)
+; CHECK: [[LOAD:%[0-9]+]]:gr32 = MOV32rm killed [[POINTER]], 1, $noreg, 4, $noreg :: (load 4 from %ir.v + 4)
+; CHECK: $eax = COPY [[LOAD]]
+; CHECK: RET 0, $eax
+define i32 @const_index(<8 x i32>* %v) {
+ %a = load <8 x i32>, <8 x i32>* %v
+ %b = extractelement <8 x i32> %a, i32 1
+ ret i32 %b
+}
+
+; CHECK: name: variable_index
+; CHECK: bb.0 (%ir-block.0):
+; CHECK: [[INDEX:%[0-9]+]]:gr32_nosp = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (load 4 from %fixed-stack.0)
+; CHECK: [[POINTER:%[0-9]+]]:gr32 = MOV32rm %fixed-stack.1, 1, $noreg, 0, $noreg :: (load 4 from %fixed-stack.1)
+; CHECK: [[LOAD:%[0-9]+]]:gr32 = MOV32rm killed [[POINTER]], 4, killed [[INDEX]], 0, $noreg :: (load 4)
+; CHECK: $eax = COPY [[LOAD]]
+; CHECK: RET 0, $eax
+define i32 @variable_index(<8 x i32>* %v, i32 %i) {
+ %a = load <8 x i32>, <8 x i32>* %v
+ %b = extractelement <8 x i32> %a, i32 %i
+ ret i32 %b
+}
+
+; CHECK: name: variable_index_with_addrspace
+; CHECK: bb.0 (%ir-block.0):
+; CHECK: [[INDEX:%[0-9]+]]:gr32_nosp = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (load 4 from %fixed-stack.0)
+; CHECK: [[POINTER:%[0-9]+]]:gr32 = MOV32rm %fixed-stack.1, 1, $noreg, 0, $noreg :: (load 4 from %fixed-stack.1)
+; CHECK: [[LOAD:%[0-9]+]]:gr32 = MOV32rm killed [[POINTER]], 4, killed [[INDEX]], 0, $noreg :: (load 4, addrspace 1)
+; CHECK: $eax = COPY [[LOAD]]
+; CHECK: RET 0, $eax
+define i32 @variable_index_with_addrspace(<8 x i32> addrspace(1)* %v, i32 %i) {
+ %a = load <8 x i32>, <8 x i32> addrspace(1)* %v
+ %b = extractelement <8 x i32> %a, i32 %i
+ ret i32 %b
+}
Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -15656,7 +15656,9 @@
Offset = DAG.getNode(
ISD::MUL, DL, PtrType, Offset,
DAG.getConstant(VecEltVT.getStoreSize(), DL, PtrType));
- MPI = OriginalLoad->getPointerInfo();
+ // Discard the pointer info except the address space because the memory
+ // operand can't represent this new access since the offset is variable.
+ MPI = MachinePointerInfo(OriginalLoad->getPointerInfo().getAddrSpace());
}
NewPtr = DAG.getNode(ISD::ADD, DL, PtrType, NewPtr, Offset);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57616.185160.patch
Type: text/x-patch
Size: 3093 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190204/21c0136a/attachment.bin>
More information about the llvm-commits
mailing list