-
Notifications
You must be signed in to change notification settings - Fork 13.3k
AMDGPU/MC: Fix emitting absolute expressions #136789
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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: 1623866 ("[AMDGPU][MC] Support UC_VERSION_* constants. (llvm#95618)")
@llvm/pr-subscribers-backend-amdgpu Author: Nicolai Hähnle (nhaehnle) ChangesWhen 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: 1623866 ("[AMDGPU][MC] Support UC_VERSION_* constants. (#95618)") Full diff: https://github.com/llvm/llvm-project/pull/136789.diff 1 Files Affected:
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;
}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't see why this isn't testable
Any suggestions as to how? In the downstream case, this is triggered by a new MCResourceInfo::ResourceInfoKind which can be placed into an instruction operand. It's possible I missed something, but in main these enums only seem to be used in connection to the kernel descriptor. (And the code I'm changing was initially added for the MC-only purpose of supporting some s_version syntax.) |
So emit a kernel descriptor? |
Maybe I misunderstand what you mean, but kernel descriptors don't contain instructions, do they? |
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: 1623866 ("[AMDGPU][MC] Support UC_VERSION_* constants. (#95618)")