[llvm] ce270b4 - MCExpr: Move isSymbolUsedInExpression workaround to AMDGPU
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 8 00:02:32 PDT 2025
Author: Fangrui Song
Date: 2025-06-08T00:02:27-07:00
New Revision: ce270b495d32710f6e4c42b5c7f6678b1f01db60
URL: https://github.com/llvm/llvm-project/commit/ce270b495d32710f6e4c42b5c7f6678b1f01db60
DIFF: https://github.com/llvm/llvm-project/commit/ce270b495d32710f6e4c42b5c7f6678b1f01db60.diff
LOG: MCExpr: Move isSymbolUsedInExpression workaround to AMDGPU
This function was a workaround used to detect cyclic dependency
(properly resolved by 343428c666f9293ae260bbcf79130562b830b268).
We do not want backends to use it. However, #112251 exposed it to MCExpr
to be reused by AMDGPU. Keep the workaround within AMDGPU to prevent
other backends from accidentally relying on it.
Added:
Modified:
llvm/include/llvm/MC/MCExpr.h
llvm/lib/MC/MCExpr.cpp
llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp
llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.cpp
llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCExpr.h b/llvm/include/llvm/MC/MCExpr.h
index 18e2aa14bd96f..0b8af09fe1c2f 100644
--- a/llvm/include/llvm/MC/MCExpr.h
+++ b/llvm/include/llvm/MC/MCExpr.h
@@ -86,10 +86,6 @@ class MCExpr {
int SurroundingPrec = 0) const;
LLVM_ABI void dump() const;
- /// Returns whether the given symbol is used anywhere in the expression or
- /// subexpressions.
- LLVM_ABI bool isSymbolUsedInExpression(const MCSymbol *Sym) const;
-
/// @}
/// \name Expression Evaluation
/// @{
@@ -489,9 +485,6 @@ class LLVM_ABI MCTargetExpr : public MCExpr {
const MCAssembler *Asm) const = 0;
// allow Target Expressions to be checked for equality
virtual bool isEqualTo(const MCExpr *x) const { return false; }
- virtual bool isSymbolUsedInExpression(const MCSymbol *Sym) const {
- return false;
- }
// This should be set when assigned expressions are not valid ".set"
// expressions, e.g. registers, and must be inlined.
virtual bool inlineAssignedExpr() const { return false; }
diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp
index e4172bf83a206..aec698721d9d7 100644
--- a/llvm/lib/MC/MCExpr.cpp
+++ b/llvm/lib/MC/MCExpr.cpp
@@ -187,38 +187,6 @@ LLVM_DUMP_METHOD void MCExpr::dump() const {
}
#endif
-bool MCExpr::isSymbolUsedInExpression(const MCSymbol *Sym) const {
- switch (getKind()) {
- case MCExpr::Binary: {
- const MCBinaryExpr *BE = static_cast<const MCBinaryExpr *>(this);
- return BE->getLHS()->isSymbolUsedInExpression(Sym) ||
- BE->getRHS()->isSymbolUsedInExpression(Sym);
- }
- case MCExpr::Target: {
- const MCTargetExpr *TE = static_cast<const MCTargetExpr *>(this);
- return TE->isSymbolUsedInExpression(Sym);
- }
- case MCExpr::Constant:
- return false;
- case MCExpr::SymbolRef: {
- const MCSymbol &S = static_cast<const MCSymbolRefExpr *>(this)->getSymbol();
- if (S.isVariable() && !S.isWeakExternal())
- return S.getVariableValue()->isSymbolUsedInExpression(Sym);
- return &S == Sym;
- }
- case MCExpr::Unary: {
- const MCExpr *SubExpr =
- static_cast<const MCUnaryExpr *>(this)->getSubExpr();
- return SubExpr->isSymbolUsedInExpression(Sym);
- }
- case MCExpr::Specifier:
- return static_cast<const MCSpecifierExpr *>(this)->isSymbolUsedInExpression(
- Sym);
- }
-
- llvm_unreachable("Unknown expr kind!");
-}
-
/* *** */
const MCBinaryExpr *MCBinaryExpr::create(Opcode Opc, const MCExpr *LHS,
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp
index 7d2596d666185..e3e3e411c6843 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp
@@ -127,7 +127,8 @@ void MCResourceInfo::assignResourceInfoExpr(
// Avoid constructing recursive definitions by detecting whether `Sym` is
// found transitively within any of its `CalleeValSym`.
if (!CalleeValSym->isVariable() ||
- !CalleeValSym->getVariableValue()->isSymbolUsedInExpression(Sym)) {
+ !AMDGPUMCExpr::isSymbolUsedInExpression(
+ Sym, CalleeValSym->getVariableValue())) {
LLVM_DEBUG(dbgs() << "MCResUse: " << Sym->getName() << ": Adding "
<< CalleeValSym->getName() << " as callee\n");
ArgExprs.push_back(MCSymbolRefExpr::create(CalleeValSym, OutContext));
@@ -243,7 +244,8 @@ void MCResourceInfo::gatherResourceInfo(
// Avoid constructing recursive definitions by detecting whether `Sym`
// is found transitively within any of its `CalleeValSym`.
if (!CalleeValSym->isVariable() ||
- !CalleeValSym->getVariableValue()->isSymbolUsedInExpression(Sym)) {
+ !AMDGPUMCExpr::isSymbolUsedInExpression(
+ Sym, CalleeValSym->getVariableValue())) {
LLVM_DEBUG(dbgs() << "MCResUse: " << Sym->getName() << ": Adding "
<< CalleeValSym->getName() << " as callee\n");
ArgExprs.push_back(MCSymbolRefExpr::create(CalleeValSym, OutContext));
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.cpp
index 40b85cd8bb3b9..7b04fb576f438 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.cpp
@@ -214,6 +214,37 @@ bool AMDGPUMCExpr::evaluateOccupancy(MCValue &Res,
return true;
}
+bool AMDGPUMCExpr::isSymbolUsedInExpression(const MCSymbol *Sym,
+ const MCExpr *E) {
+ switch (E->getKind()) {
+ case MCExpr::Constant:
+ return false;
+ case MCExpr::Unary:
+ return isSymbolUsedInExpression(
+ Sym, static_cast<const MCUnaryExpr *>(E)->getSubExpr());
+ case MCExpr::Binary: {
+ const MCBinaryExpr *BE = static_cast<const MCBinaryExpr *>(E);
+ return isSymbolUsedInExpression(Sym, BE->getLHS()) ||
+ isSymbolUsedInExpression(Sym, BE->getRHS());
+ }
+ case MCExpr::SymbolRef: {
+ const MCSymbol &S = static_cast<const MCSymbolRefExpr *>(E)->getSymbol();
+ if (S.isVariable())
+ return isSymbolUsedInExpression(Sym, S.getVariableValue());
+ return &S == Sym;
+ }
+ case MCExpr::Specifier:
+ case MCExpr::Target: {
+ auto *TE = static_cast<const AMDGPUMCExpr *>(E);
+ for (const MCExpr *E : TE->getArgs())
+ if (isSymbolUsedInExpression(Sym, E))
+ return true;
+ return false;
+ }
+ }
+ llvm_unreachable("Unknown expr kind!");
+}
+
bool AMDGPUMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
const MCAssembler *Asm) const {
std::optional<int64_t> Total;
@@ -303,14 +334,6 @@ const AMDGPUMCExpr *AMDGPUMCExpr::createOccupancy(unsigned InitOcc,
Ctx);
}
-bool AMDGPUMCExpr::isSymbolUsedInExpression(const MCSymbol *Sym) const {
- for (const MCExpr *E : getArgs()) {
- if (E->isSymbolUsedInExpression(Sym))
- return true;
- }
- return false;
-}
-
static KnownBits fromOptionalToKnownBits(std::optional<bool> CompareResult) {
static constexpr unsigned BitWidth = 64;
const APInt True(BitWidth, 1);
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h
index f38320ae79858..0da31b344de55 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h
@@ -106,13 +106,13 @@ class AMDGPUMCExpr : public MCTargetExpr {
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
bool evaluateAsRelocatableImpl(MCValue &Res,
const MCAssembler *Asm) const override;
- bool isSymbolUsedInExpression(const MCSymbol *Sym) const override;
void visitUsedExpr(MCStreamer &Streamer) const override;
MCFragment *findAssociatedFragment() const override;
static bool classof(const MCExpr *E) {
return E->getKind() == MCExpr::Target;
}
+ static bool isSymbolUsedInExpression(const MCSymbol *Sym, const MCExpr *E);
};
namespace AMDGPU {
More information about the llvm-commits
mailing list