[lld] [IPSCCP] Variable not visible at Og. (PR #66745)
Felipe de Azevedo Piovezan via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 4 15:07:14 PDT 2023
================
@@ -106,14 +107,71 @@ static void findReturnsToZap(Function &F,
}
}
-static bool runIPSCCP(
- Module &M, const DataLayout &DL, FunctionAnalysisManager *FAM,
- std::function<const TargetLibraryInfo &(Function &)> GetTLI,
- std::function<TargetTransformInfo &(Function &)> GetTTI,
- std::function<AssumptionCache &(Function &)> GetAC,
- std::function<DominatorTree &(Function &)> GetDT,
- std::function<BlockFrequencyInfo &(Function &)> GetBFI,
- bool IsFuncSpecEnabled) {
+static void createDebugConstantExpression(Module &M, GlobalVariable *GV) {
+ SmallVector<DIGlobalVariableExpression *, 1> GVEs;
+ GV->getDebugInfo(GVEs);
+ if (GVEs.size() != 1)
+ return;
+
+ DIBuilder DIB(M);
+
+ // Create integer constant expression.
+ auto createIntegerExpression = [&DIB](const Constant *CV) -> DIExpression * {
+ const APInt &API = cast<ConstantInt>(CV)->getValue();
+ std::optional<uint64_t> InitIntOpt;
+ if (API.isNonNegative())
+ InitIntOpt = API.tryZExtValue();
+ else if (auto Temp = API.trySExtValue())
+ // Transform a signed optional to unsigned optional.
+ InitIntOpt = static_cast<uint64_t>(*Temp);
+ return InitIntOpt ? DIB.createConstantValueExpression(InitIntOpt.value())
+ : nullptr;
+ };
+
+ const Constant *CV = GV->getInitializer();
+ Type *Ty = GV->getValueType();
+ if (Ty->isIntegerTy()) {
+ DIExpression *InitExpr = createIntegerExpression(CV);
+ if (InitExpr)
+ GVEs[0]->replaceOperandWith(1, InitExpr);
+ return;
+ }
+
+ if (Ty->isFloatTy() || Ty->isDoubleTy()) {
+ const APFloat &APF = cast<ConstantFP>(CV)->getValueAPF();
+ GVEs[0]->replaceOperandWith(1, DIB.createConstantValueExpression(
+ APF.bitcastToAPInt().getZExtValue()));
+ return;
+ }
+
+ if (!Ty->isPointerTy())
+ return;
+
+ if (isa<ConstantPointerNull>(CV)) {
+ GVEs[0]->replaceOperandWith(1, DIB.createConstantValueExpression(0));
+ return;
+ }
+ if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
+ CE->getNumOperands() == 1) {
+ const Value *V = CE->getOperand(0);
+ const Constant *CV = dyn_cast<Constant>(V);
+ if (CV && !isa<GlobalValue>(CV);
----------------
felipepiovezan wrote:
Yeah, I believe the intent here would be:
```
if (auto CI = dyn_cast_or_null<ConstantInt>(V)) {
...
}
```
Note that `!isa<GlobalValue>(CV)` is not necessary: a global value is always a pointer, therefore it cannot be a `ConstantInt`
https://github.com/llvm/llvm-project/pull/66745
More information about the llvm-commits
mailing list