[llvm] AMDGPU/MC: Fix emitting absolute expressions (PR #136789)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 22 16:48:07 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Nicolai Hähnle (nhaehnle)
<details>
<summary>Changes</summary>
When absolute MCExprs appear in normal instruction operands, we have to emit them like a normal inline constant or literal. More generally, an MCExpr that happens to have an absolute evaluation should be treated exactly like an immediate operand here.
No test; I found this downstream, and I don't think it can be triggered upstream yet.
Fixes: 16238669 ("[AMDGPU][MC] Support UC_VERSION_* constants. (#<!-- -->95618)")
---
Full diff: https://github.com/llvm/llvm-project/pull/136789.diff
1 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp (+13-7)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp
index 1e82ee36dc0eb..9cf712318bfa1 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp
@@ -647,13 +647,15 @@ void AMDGPUMCCodeEmitter::getMachineOpValueT16Lo128(
void AMDGPUMCCodeEmitter::getMachineOpValueCommon(
const MCInst &MI, const MCOperand &MO, unsigned OpNo, APInt &Op,
SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const {
+ bool isLikeImm = false;
int64_t Val;
- if (MO.isExpr() && MO.getExpr()->evaluateAsAbsolute(Val)) {
- Op = Val;
- return;
- }
- if (MO.isExpr() && MO.getExpr()->getKind() != MCExpr::Constant) {
+ if (MO.isImm()) {
+ Val = MO.getImm();
+ isLikeImm = true;
+ } else if (MO.isExpr() && MO.getExpr()->evaluateAsAbsolute(Val)) {
+ isLikeImm = true;
+ } else if (MO.isExpr()) {
// FIXME: If this is expression is PCRel or not should not depend on what
// the expression looks like. Given that this is just a general expression,
// it should probably be FK_Data_4 and whatever is producing
@@ -683,8 +685,12 @@ void AMDGPUMCCodeEmitter::getMachineOpValueCommon(
Op = *Enc;
return;
}
- } else if (MO.isImm()) {
- Op = MO.getImm();
+
+ llvm_unreachable("Operand not supported for SISrc");
+ }
+
+ if (isLikeImm) {
+ Op = Val;
return;
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/136789
More information about the llvm-commits
mailing list