mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[AMDGPU] Allow multiple uses of the same literal
In GFX10 VOP3 can have a literal, which opens up the possibility of two operands using the same literal value, which is allowed and only counts as one use of the constant bus. AMDGPUAsmParser::validateConstantBusLimitations already knew about this but SIInstrInfo::verifyInstruction did not. Differential Revision: https://reviews.llvm.org/D100770
This commit is contained in:
parent
f908c89361
commit
55e098ac95
@ -3986,7 +3986,8 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr &MI,
|
||||
const int OpIndices[] = { Src0Idx, Src1Idx, Src2Idx };
|
||||
|
||||
unsigned ConstantBusCount = 0;
|
||||
unsigned LiteralCount = 0;
|
||||
bool UsesLiteral = false;
|
||||
const MachineOperand *LiteralVal = nullptr;
|
||||
|
||||
if (AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::imm) != -1)
|
||||
++ConstantBusCount;
|
||||
@ -4008,8 +4009,15 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr &MI,
|
||||
SGPRsUsed.push_back(SGPRUsed);
|
||||
}
|
||||
} else {
|
||||
++ConstantBusCount;
|
||||
++LiteralCount;
|
||||
if (!UsesLiteral) {
|
||||
++ConstantBusCount;
|
||||
UsesLiteral = true;
|
||||
LiteralVal = &MO;
|
||||
} else if (!MO.isIdenticalTo(*LiteralVal)) {
|
||||
assert(isVOP3(MI));
|
||||
ErrInfo = "VOP3 instruction uses more than one literal";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4033,15 +4041,9 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr &MI,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isVOP3(MI) && LiteralCount) {
|
||||
if (!ST.hasVOP3Literal()) {
|
||||
ErrInfo = "VOP3 instruction uses literal";
|
||||
return false;
|
||||
}
|
||||
if (LiteralCount > 1) {
|
||||
ErrInfo = "VOP3 instruction uses more than one literal";
|
||||
return false;
|
||||
}
|
||||
if (isVOP3(MI) && UsesLiteral && !ST.hasVOP3Literal()) {
|
||||
ErrInfo = "VOP3 instruction uses literal";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
28
test/CodeGen/AMDGPU/verify-duplicate-literal.mir
Normal file
28
test/CodeGen/AMDGPU/verify-duplicate-literal.mir
Normal file
@ -0,0 +1,28 @@
|
||||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
||||
# RUN: llc -march=amdgcn -mcpu=gfx1010 -run-pass machineverifier -o - %s | FileCheck %s
|
||||
|
||||
# Two uses of the same literal only count as one use of the constant bus.
|
||||
|
||||
---
|
||||
name: use_duplicate_literal_cndmask
|
||||
tracksRegLiveness: true
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $vcc_lo
|
||||
; CHECK-LABEL: name: use_duplicate_literal_cndmask
|
||||
; CHECK: liveins: $vcc_lo
|
||||
; CHECK: $vgpr0 = V_CNDMASK_B32_e64 0, 1234567, 0, 1234567, killed $vcc_lo, implicit $exec
|
||||
$vgpr0 = V_CNDMASK_B32_e64 0, 1234567, 0, 1234567, killed $vcc_lo, implicit $exec
|
||||
...
|
||||
|
||||
---
|
||||
name: use_duplicate_literal_fma
|
||||
tracksRegLiveness: true
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $vgpr0
|
||||
; CHECK-LABEL: name: use_duplicate_literal_fma
|
||||
; CHECK: liveins: $vgpr0
|
||||
; CHECK: $vgpr0 = V_FMA_F32_e64 0, $vgpr0, 0, 1077936128, 0, 1077936128, 0, 0, implicit $mode, implicit $exec
|
||||
$vgpr0 = V_FMA_F32_e64 0, $vgpr0, 0, 1077936128, 0, 1077936128, 0, 0, implicit $mode, implicit $exec
|
||||
...
|
Loading…
x
Reference in New Issue
Block a user