From: Matt Arsenault Date: Wed, 10 Sep 2014 23:26:19 +0000 (+0000) Subject: R600/SI: Fix losing chain when fixing reg class of loads. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5ee5d45e7e94fe6a3ecaa338c07ab86c8f855018;p=oota-llvm.git R600/SI: Fix losing chain when fixing reg class of loads. The lost chain resulting in earlier side effecting nodes being deleted. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217561 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/R600/SIISelLowering.cpp b/lib/Target/R600/SIISelLowering.cpp index 629a42cdfbd..9eef742e83d 100644 --- a/lib/Target/R600/SIISelLowering.cpp +++ b/lib/Target/R600/SIISelLowering.cpp @@ -2004,12 +2004,20 @@ MachineSDNode *SITargetLowering::AdjustRegClass(MachineSDNode *N, return N; } ConstantSDNode *Offset = cast(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 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/test/CodeGen/R600/missing-store.ll b/test/CodeGen/R600/missing-store.ll new file mode 100644 index 00000000000..ab1f4d059b6 --- /dev/null +++ b/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 } +