AMDGPU/MC: Fix emitting absolute expressions (#136789)
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)")
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user