mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[AMDGPU] Avoid an illegal operand in si-shrink-instructions
Before the patch it was possible to trigger a constant bus violation when folding immediates into a shrunk instruction. The patch adds a check to enforce the legality of the new operand. Differential Revision: https://reviews.llvm.org/D95527
This commit is contained in:
parent
2c90b2760d
commit
2a9ac6c11e
@ -75,17 +75,19 @@ static bool foldImmediates(MachineInstr &MI, const SIInstrInfo *TII,
|
||||
MachineOperand &MovSrc = Def->getOperand(1);
|
||||
bool ConstantFolded = false;
|
||||
|
||||
if (MovSrc.isImm() && (isInt<32>(MovSrc.getImm()) ||
|
||||
isUInt<32>(MovSrc.getImm()))) {
|
||||
Src0.ChangeToImmediate(MovSrc.getImm());
|
||||
ConstantFolded = true;
|
||||
} else if (MovSrc.isFI()) {
|
||||
Src0.ChangeToFrameIndex(MovSrc.getIndex());
|
||||
ConstantFolded = true;
|
||||
} else if (MovSrc.isGlobal()) {
|
||||
Src0.ChangeToGA(MovSrc.getGlobal(), MovSrc.getOffset(),
|
||||
MovSrc.getTargetFlags());
|
||||
ConstantFolded = true;
|
||||
if (TII->isOperandLegal(MI, Src0Idx, &MovSrc)) {
|
||||
if (MovSrc.isImm() &&
|
||||
(isInt<32>(MovSrc.getImm()) || isUInt<32>(MovSrc.getImm()))) {
|
||||
Src0.ChangeToImmediate(MovSrc.getImm());
|
||||
ConstantFolded = true;
|
||||
} else if (MovSrc.isFI()) {
|
||||
Src0.ChangeToFrameIndex(MovSrc.getIndex());
|
||||
ConstantFolded = true;
|
||||
} else if (MovSrc.isGlobal()) {
|
||||
Src0.ChangeToGA(MovSrc.getGlobal(), MovSrc.getOffset(),
|
||||
MovSrc.getTargetFlags());
|
||||
ConstantFolded = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (ConstantFolded) {
|
||||
|
23
test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir
Normal file
23
test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir
Normal file
@ -0,0 +1,23 @@
|
||||
# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=si-shrink-instructions --verify-machineinstrs %s -o - | FileCheck %s
|
||||
|
||||
# Make sure immediate folding into V_CNDMASK respects constant bus restrictions.
|
||||
---
|
||||
|
||||
name: shrink_cndmask_illegal_imm_folding
|
||||
tracksRegLiveness: true
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $vgpr0, $vgpr1
|
||||
; CHECK-LABEL: name: shrink_cndmask_illegal_imm_folding
|
||||
; CHECK: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
|
||||
; CHECK: [[MOV:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 32768, implicit $exec
|
||||
; CHECK: V_CMP_EQ_U32_e32 0, [[COPY]], implicit-def $vcc, implicit $exec
|
||||
; CHECK: V_CNDMASK_B32_e32 [[MOV]], killed [[COPY]], implicit $vcc, implicit $exec
|
||||
|
||||
%0:vgpr_32 = COPY $vgpr0
|
||||
%1:vgpr_32 = V_MOV_B32_e32 32768, implicit $exec
|
||||
V_CMP_EQ_U32_e32 0, %0:vgpr_32, implicit-def $vcc, implicit $exec
|
||||
%2:vgpr_32 = V_CNDMASK_B32_e64 0, %1:vgpr_32, 0, killed %0:vgpr_32, $vcc, implicit $exec
|
||||
S_NOP 0
|
||||
|
||||
...
|
Loading…
Reference in New Issue
Block a user