[PATCH] D102096: [DAGCombiner] Fix DAG combine store elimination, different address space.
Hendrik Greving via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 12 07:22:28 PDT 2021
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
hgreving marked an inline comment as done.
Closed by commit rG762ac725bf97: [DAGCombiner] Fix DAG combine store elimination, different address space. (authored by hgreving).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D102096/new/
https://reviews.llvm.org/D102096
Files:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/X86/dagcombine-dead-store.ll
Index: llvm/test/CodeGen/X86/dagcombine-dead-store.ll
===================================================================
--- llvm/test/CodeGen/X86/dagcombine-dead-store.ll
+++ llvm/test/CodeGen/X86/dagcombine-dead-store.ll
@@ -6,12 +6,11 @@
; The test's 'same' and 'diff' notation depicts whether the pointer value is the same
; or different.
-; FIXME: DAG combine incorrectly eliminates store if pointer is of same value.
-
define i32 @copy_fs_same() {
; CHECK-LABEL: copy_fs_same:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl 1, %eax
+; CHECK-NEXT: movl %eax, %fs:1
; CHECK-NEXT: retl
entry:
%0 = load i32, i32* inttoptr (i64 1 to i32*), align 4
@@ -36,6 +35,7 @@
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
; CHECK-NEXT: movl %eax, 1
+; CHECK-NEXT: movl %eax, %fs:1
; CHECK-NEXT: retl
entry:
store i32 %v, i32* inttoptr (i64 1 to i32*), align 4
@@ -62,6 +62,7 @@
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
; CHECK-NEXT: movl %eax, 168(%ecx)
+; CHECK-NEXT: movl %eax, %fs:168(%ecx)
; CHECK-NEXT: retl
%p = getelementptr i32, i32* %b, i64 42
%pa = addrspacecast i32* %p to i32 addrspace(257)*
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -17916,6 +17916,7 @@
if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(Value)) {
if (Ld->getBasePtr() == Ptr && ST->getMemoryVT() == Ld->getMemoryVT() &&
ST->isUnindexed() && ST->isSimple() &&
+ Ld->getAddressSpace() == ST->getAddressSpace() &&
// There can't be any side effects between the load and store, such as
// a call or store.
Chain.reachesChainWithoutSideEffects(SDValue(Ld, 1))) {
@@ -17929,7 +17930,8 @@
if (ST->isUnindexed() && ST->isSimple() &&
ST1->isUnindexed() && ST1->isSimple()) {
if (ST1->getBasePtr() == Ptr && ST1->getValue() == Value &&
- ST->getMemoryVT() == ST1->getMemoryVT()) {
+ ST->getMemoryVT() == ST1->getMemoryVT() &&
+ ST->getAddressSpace() == ST1->getAddressSpace()) {
// If this is a store followed by a store with the same value to the
// same location, then the store is dead/noop.
return Chain;
@@ -17940,7 +17942,8 @@
// BaseIndexOffset and the code below requires knowing the size
// of a vector, so bail out if MemoryVT is scalable.
!ST->getMemoryVT().isScalableVector() &&
- !ST1->getMemoryVT().isScalableVector()) {
+ !ST1->getMemoryVT().isScalableVector() &&
+ ST->getAddressSpace() == ST1->getAddressSpace()) {
const BaseIndexOffset STBase = BaseIndexOffset::match(ST, DAG);
const BaseIndexOffset ChainBase = BaseIndexOffset::match(ST1, DAG);
unsigned STBitSize = ST->getMemoryVT().getFixedSizeInBits();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102096.344819.patch
Type: text/x-patch
Size: 3020 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210512/d15290ee/attachment.bin>
More information about the llvm-commits
mailing list