mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-03 13:31:05 +00:00
R600/SI: Fix unreachable with a sext_in_reg to an illegal type.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204945 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
decb7e6d9b
commit
94687c0f43
@ -333,6 +333,24 @@ SDValue AMDGPUTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG)
|
|||||||
return Op;
|
return Op;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AMDGPUTargetLowering::ReplaceNodeResults(SDNode *N,
|
||||||
|
SmallVectorImpl<SDValue> &Results,
|
||||||
|
SelectionDAG &DAG) const {
|
||||||
|
switch (N->getOpcode()) {
|
||||||
|
case ISD::SIGN_EXTEND_INREG:
|
||||||
|
// Different parts of legalization seem to interpret which type of
|
||||||
|
// sign_extend_inreg is the one to check for custom lowering. The extended
|
||||||
|
// from type is what really matters, but some places check for custom
|
||||||
|
// lowering of the result type. This results in trying to use
|
||||||
|
// ReplaceNodeResults to sext_in_reg to an illegal type, so we'll just do
|
||||||
|
// nothing here and let the illegal result integer be handled normally.
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SDValue AMDGPUTargetLowering::LowerConstantInitializer(const Constant* Init,
|
SDValue AMDGPUTargetLowering::LowerConstantInitializer(const Constant* Init,
|
||||||
const GlobalValue *GV,
|
const GlobalValue *GV,
|
||||||
const SDValue &InitPtr,
|
const SDValue &InitPtr,
|
||||||
|
@ -103,6 +103,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
|
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
virtual void ReplaceNodeResults(SDNode * N,
|
||||||
|
SmallVectorImpl<SDValue> &Results,
|
||||||
|
SelectionDAG &DAG) const override;
|
||||||
|
|
||||||
SDValue LowerIntrinsicIABS(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerIntrinsicIABS(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerIntrinsicLRP(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerIntrinsicLRP(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerMinMax(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerMinMax(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
@ -762,7 +762,9 @@ void R600TargetLowering::ReplaceNodeResults(SDNode *N,
|
|||||||
SmallVectorImpl<SDValue> &Results,
|
SmallVectorImpl<SDValue> &Results,
|
||||||
SelectionDAG &DAG) const {
|
SelectionDAG &DAG) const {
|
||||||
switch (N->getOpcode()) {
|
switch (N->getOpcode()) {
|
||||||
default: return;
|
default:
|
||||||
|
AMDGPUTargetLowering::ReplaceNodeResults(N, Results, DAG);
|
||||||
|
return;
|
||||||
case ISD::FP_TO_UINT: Results.push_back(LowerFPTOUINT(N->getOperand(0), DAG));
|
case ISD::FP_TO_UINT: Results.push_back(LowerFPTOUINT(N->getOperand(0), DAG));
|
||||||
return;
|
return;
|
||||||
case ISD::LOAD: {
|
case ISD::LOAD: {
|
||||||
|
@ -28,9 +28,9 @@ public:
|
|||||||
MachineBasicBlock * BB) const;
|
MachineBasicBlock * BB) const;
|
||||||
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
|
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
|
||||||
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
|
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
|
||||||
void ReplaceNodeResults(SDNode * N,
|
virtual void ReplaceNodeResults(SDNode * N,
|
||||||
SmallVectorImpl<SDValue> &Results,
|
SmallVectorImpl<SDValue> &Results,
|
||||||
SelectionDAG &DAG) const;
|
SelectionDAG &DAG) const override;
|
||||||
virtual SDValue LowerFormalArguments(
|
virtual SDValue LowerFormalArguments(
|
||||||
SDValue Chain,
|
SDValue Chain,
|
||||||
CallingConv::ID CallConv,
|
CallingConv::ID CallConv,
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
; RUN: llc < %s -march=r600 -mcpu=SI | FileCheck -check-prefix=SI -check-prefix=FUNC %s
|
; RUN: llc < %s -march=r600 -mcpu=SI | FileCheck -check-prefix=SI -check-prefix=FUNC %s
|
||||||
; RUN: llc < %s -march=r600 -mcpu=cypress | FileCheck -check-prefix=EG -check-prefix=FUNC %s
|
; RUN: llc < %s -march=r600 -mcpu=cypress | FileCheck -check-prefix=EG -check-prefix=FUNC %s
|
||||||
|
|
||||||
|
declare i32 @llvm.AMDGPU.imax(i32, i32) nounwind readnone
|
||||||
|
|
||||||
|
|
||||||
; FUNC-LABEL: @sext_in_reg_i1_i32
|
; FUNC-LABEL: @sext_in_reg_i1_i32
|
||||||
; SI: S_LOAD_DWORD [[ARG:s[0-9]+]],
|
; SI: S_LOAD_DWORD [[ARG:s[0-9]+]],
|
||||||
; SI: V_BFE_I32 [[EXTRACT:v[0-9]+]], [[ARG]], 0, 1
|
; SI: V_BFE_I32 [[EXTRACT:v[0-9]+]], [[ARG]], 0, 1
|
||||||
@ -248,3 +251,21 @@ define void @testcase_3(i8 addrspace(1)* %out, i8 %a) nounwind {
|
|||||||
store i8 %xor, i8 addrspace(1)* %out
|
store i8 %xor, i8 addrspace(1)* %out
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; FIXME: The BFE should really be eliminated. I think it should happen
|
||||||
|
; when computeMaskedBitsForTargetNode is implemented for imax.
|
||||||
|
|
||||||
|
; FUNC-LABEL: @sext_in_reg_to_illegal_type
|
||||||
|
; SI: BUFFER_LOAD_SBYTE
|
||||||
|
; SI: V_MAX_I32
|
||||||
|
; SI: V_BFE_I32
|
||||||
|
; SI: BUFFER_STORE_SHORT
|
||||||
|
define void @sext_in_reg_to_illegal_type(i16 addrspace(1)* nocapture %out, i8 addrspace(1)* nocapture %src) nounwind {
|
||||||
|
%tmp5 = load i8 addrspace(1)* %src, align 1
|
||||||
|
%tmp2 = sext i8 %tmp5 to i32
|
||||||
|
%tmp3 = tail call i32 @llvm.AMDGPU.imax(i32 %tmp2, i32 0) nounwind readnone
|
||||||
|
%tmp4 = trunc i32 %tmp3 to i8
|
||||||
|
%tmp6 = sext i8 %tmp4 to i16
|
||||||
|
store i16 %tmp6, i16 addrspace(1)* %out, align 2
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user