[clang] [IPSCCP] Variable not visible at Og. (PR #66745)

Felipe de Azevedo Piovezan via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 4 15:07:12 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 cfe-commits mailing list