forked from OSchip/llvm-project
AMDGPU: Fix failures from overflowing uint8_t number of operands
If the operand index exceeded the limit of unsigned char, it wrapped and would point to the wrong operand. Increase the size of the operand index field to avoid this, and also don't bother trying to fold into implicit operands.
This commit is contained in:
parent
1404d9d68a
commit
b9c644ec61
|
@ -35,7 +35,7 @@ struct FoldCandidate {
|
||||||
int FrameIndexToFold;
|
int FrameIndexToFold;
|
||||||
};
|
};
|
||||||
int ShrinkOpcode;
|
int ShrinkOpcode;
|
||||||
unsigned char UseOpNo;
|
unsigned UseOpNo;
|
||||||
MachineOperand::MachineOperandType Kind;
|
MachineOperand::MachineOperandType Kind;
|
||||||
bool Commuted;
|
bool Commuted;
|
||||||
|
|
||||||
|
@ -662,6 +662,11 @@ void SIFoldOperands::foldOperand(
|
||||||
Use = MRI->use_begin(DestReg), E = MRI->use_end();
|
Use = MRI->use_begin(DestReg), E = MRI->use_end();
|
||||||
Use != E; Use = NextUse) {
|
Use != E; Use = NextUse) {
|
||||||
NextUse = std::next(Use);
|
NextUse = std::next(Use);
|
||||||
|
|
||||||
|
// There's no point trying to fold into an implicit operand.
|
||||||
|
if (Use->isImplicit())
|
||||||
|
continue;
|
||||||
|
|
||||||
FoldCandidate FC = FoldCandidate(Use->getParent(),
|
FoldCandidate FC = FoldCandidate(Use->getParent(),
|
||||||
Use.getOperandNo(), &UseMI->getOperand(1));
|
Use.getOperandNo(), &UseMI->getOperand(1));
|
||||||
CopyUses.push_back(FC);
|
CopyUses.push_back(FC);
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -run-pass=si-fold-operands %s -o - | FileCheck -check-prefix=GCN %s
|
||||||
|
|
||||||
|
# We were storing fold candidate uses in an unsigned char, which this exceeds.
|
||||||
|
# The use operand overflows and the expected register operand hits the immediate 0.
|
||||||
|
# We never have more than a handful of non-implicit operands, so don't try to fold into
|
||||||
|
# implicit operands to avoid this problem.
|
||||||
|
|
||||||
|
---
|
||||||
|
name: op_idx_overflows_uchar
|
||||||
|
tracksRegLiveness: true
|
||||||
|
body: |
|
||||||
|
bb.0:
|
||||||
|
liveins: $sgpr12_sgpr13_sgpr14_sgpr15
|
||||||
|
|
||||||
|
; GCN-LABEL: name: op_idx_overflows_uchar
|
||||||
|
; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 0
|
||||||
|
; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
||||||
|
; GCN: S_ENDPGM 0, implicit [[V_MOV_B32_e32_]]
|
||||||
|
%0:sreg_32 = S_MOV_B32 0
|
||||||
|
%1:vgpr_32 = COPY %0
|
||||||
|
S_ENDPGM 0, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1, implicit %1
|
||||||
|
...
|
Loading…
Reference in New Issue