Skip to content

Commit

Permalink
[AMDGPU] Allow multiple uses of the same literal
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jayfoad committed Apr 20, 2021
1 parent a0573b6 commit ec8c61e
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 12 deletions.
26 changes: 14 additions & 12 deletions llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
}
}
}
Expand All @@ -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;
}
}

Expand Down
28 changes: 28 additions & 0 deletions llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir
Original file line number Diff line number Diff line change
@@ -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
...

0 comments on commit ec8c61e

Please sign in to comment.