mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-25 04:39:51 +00:00
Fix pointer EVT in SelectionDAGBuilder::visitAlloca
SelectionDAGBuilder::visitAlloca assumes alloca address space is 0, which is incorrect for triple amdgcn---amdgiz and causes isel failure. This patch fixes that. Differential Revision: https://reviews.llvm.org/D40095 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@318392 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b1e1f8e9c3
commit
3c8dd1f596
@ -3508,7 +3508,7 @@ void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
|
||||
|
||||
SDValue AllocSize = getValue(I.getArraySize());
|
||||
|
||||
EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout());
|
||||
EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout(), DL.getAllocaAddrSpace());
|
||||
if (AllocSize.getValueType() != IntPtr)
|
||||
AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr);
|
||||
|
||||
@ -3529,17 +3529,15 @@ void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {
|
||||
// an address inside an alloca.
|
||||
SDNodeFlags Flags;
|
||||
Flags.setNoUnsignedWrap(true);
|
||||
AllocSize = DAG.getNode(ISD::ADD, dl,
|
||||
AllocSize.getValueType(), AllocSize,
|
||||
DAG.getIntPtrConstant(StackAlign - 1, dl), Flags);
|
||||
AllocSize = DAG.getNode(ISD::ADD, dl, AllocSize.getValueType(), AllocSize,
|
||||
DAG.getConstant(StackAlign - 1, dl, IntPtr), Flags);
|
||||
|
||||
// Mask out the low bits for alignment purposes.
|
||||
AllocSize = DAG.getNode(ISD::AND, dl,
|
||||
AllocSize.getValueType(), AllocSize,
|
||||
DAG.getIntPtrConstant(~(uint64_t)(StackAlign - 1),
|
||||
dl));
|
||||
AllocSize =
|
||||
DAG.getNode(ISD::AND, dl, AllocSize.getValueType(), AllocSize,
|
||||
DAG.getConstant(~(uint64_t)(StackAlign - 1), dl, IntPtr));
|
||||
|
||||
SDValue Ops[] = { getRoot(), AllocSize, DAG.getIntPtrConstant(Align, dl) };
|
||||
SDValue Ops[] = {getRoot(), AllocSize, DAG.getConstant(Align, dl, IntPtr)};
|
||||
SDVTList VTs = DAG.getVTList(AllocSize.getValueType(), MVT::Other);
|
||||
SDValue DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, dl, VTs, Ops);
|
||||
setValue(&I, DSA);
|
||||
|
@ -1,11 +1,12 @@
|
||||
; RUN: not llc -march=amdgcn -mcpu=tahiti -mattr=+promote-alloca -verify-machineinstrs < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=amdgcn -mcpu=tahiti -mattr=-promote-alloca -verify-machineinstrs < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=r600 -mcpu=cypress < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tahiti -mattr=+promote-alloca -verify-machineinstrs < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tahiti -mattr=-promote-alloca -verify-machineinstrs < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=r600 -mtriple=r600---amdgiz -mcpu=cypress < %s 2>&1 | FileCheck %s
|
||||
target datalayout = "A5"
|
||||
|
||||
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
|
||||
|
||||
define amdgpu_kernel void @test_dynamic_stackalloc(i32 addrspace(1)* %out, i32 %n) {
|
||||
%alloca = alloca i32, i32 %n
|
||||
store volatile i32 0, i32* %alloca
|
||||
%alloca = alloca i32, i32 %n, addrspace(5)
|
||||
store volatile i32 0, i32 addrspace(5)* %alloca
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user