[llvm] ec8c61e - [AMDGPU] Allow multiple uses of the same literal
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 20 08:44:15 PDT 2021
Author: Jay Foad
Date: 2021-04-20T16:44:01+01:00
New Revision: ec8c61efdf9537c16f7f70a1cf6e8018b1d9c664
URL: https://github.com/llvm/llvm-project/commit/ec8c61efdf9537c16f7f70a1cf6e8018b1d9c664
DIFF: https://github.com/llvm/llvm-project/commit/ec8c61efdf9537c16f7f70a1cf6e8018b1d9c664.diff
LOG: [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
Added:
llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir
Modified:
llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index b7f4505d9541..2ba4e9bdc855 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -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;
}
}
diff --git a/llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir b/llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir
new file mode 100644
index 000000000000..a6b6a01336d6
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir
@@ -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
+...
More information about the llvm-commits
mailing list