diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-09-10 23:26:19 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-09-10 23:26:19 +0000 |
commit | 61a528adc70770f83e8d82bc114f933c2d24bb72 (patch) | |
tree | 9b1bfee4ef08ab81421b2c18843348d029978182 | |
parent | 2e9911205f886422af1cf94017b67f813cace722 (diff) | |
download | bcm5719-llvm-61a528adc70770f83e8d82bc114f933c2d24bb72.tar.gz bcm5719-llvm-61a528adc70770f83e8d82bc114f933c2d24bb72.zip |
R600/SI: Fix losing chain when fixing reg class of loads.
The lost chain resulting in earlier side effecting nodes
being deleted.
llvm-svn: 217561
-rw-r--r-- | llvm/lib/Target/R600/SIISelLowering.cpp | 20 | ||||
-rw-r--r-- | llvm/test/CodeGen/R600/missing-store.ll | 26 |
2 files changed, 40 insertions, 6 deletions
diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index 629a42cdfbd..9eef742e83d 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -2004,12 +2004,20 @@ MachineSDNode *SITargetLowering::AdjustRegClass(MachineSDNode *N, return N; } ConstantSDNode *Offset = cast<ConstantSDNode>(N->getOperand(1)); - SDValue Ops[] = { - SDValue(DAG.getMachineNode(AMDGPU::SI_ADDR64_RSRC, DL, MVT::i128, - DAG.getConstant(0, MVT::i64)), 0), - N->getOperand(0), - DAG.getConstant(Offset->getSExtValue() << 2, MVT::i32) - }; + MachineSDNode *RSrc = DAG.getMachineNode(AMDGPU::SI_ADDR64_RSRC, DL, + MVT::i128, + DAG.getConstant(0, MVT::i64)); + + SmallVector<SDValue, 8> Ops; + Ops.push_back(SDValue(RSrc, 0)); + Ops.push_back(N->getOperand(0)); + Ops.push_back(DAG.getConstant(Offset->getSExtValue() << 2, MVT::i32)); + + // Copy remaining operands so we keep any chain and glue nodes that follow + // the normal operands. + for (unsigned I = 2, E = N->getNumOperands(); I != E; ++I) + Ops.push_back(N->getOperand(I)); + return DAG.getMachineNode(NewOpcode, DL, N->getVTList(), Ops); } } diff --git a/llvm/test/CodeGen/R600/missing-store.ll b/llvm/test/CodeGen/R600/missing-store.ll new file mode 100644 index 00000000000..ab1f4d059b6 --- /dev/null +++ b/llvm/test/CodeGen/R600/missing-store.ll @@ -0,0 +1,26 @@ +; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=FUNC -check-prefix=SI %s + +@ptr_load = addrspace(3) global i32 addrspace(2)* null, align 8 + +; Make sure when the load from %ptr2 is folded the chain isn't lost, +; resulting in losing the store to gptr + +; FUNC-LABEL: @missing_store_reduced +; SI: DS_READ_B64 +; SI: BUFFER_STORE_DWORD +; SI: BUFFER_LOAD_DWORD +; SI: BUFFER_STORE_DWORD +; SI: S_ENDPGM +define void @missing_store_reduced(i32 addrspace(1)* %out, i32 addrspace(1)* %gptr) #0 { + %ptr0 = load i32 addrspace(2)* addrspace(3)* @ptr_load, align 8 + %ptr2 = getelementptr inbounds i32 addrspace(2)* %ptr0, i64 2 + + store i32 99, i32 addrspace(1)* %gptr, align 4 + %tmp2 = load i32 addrspace(2)* %ptr2, align 4 + + store i32 %tmp2, i32 addrspace(1)* %out, align 4 + ret void +} + +attributes #0 = { nounwind } + |