[llvm] [IPSCCP] Variable not visible at Og: (PR #66745)

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 20 14:42:38 PDT 2023


================
@@ -371,6 +372,52 @@ static bool runIPSCCP(
       StoreInst *SI = cast<StoreInst>(GV->user_back());
       SI->eraseFromParent();
     }
+
+    // Try to create a debug constant expression for the glbal variable
+    // initializer value.
+    SmallVector<DIGlobalVariableExpression *, 1> GVEs;
+    GV->getDebugInfo(GVEs);
+    if (GVEs.size() == 1) {
+      DIBuilder DIB(M);
+
+      // Create integer constant expression.
+      auto createIntExpression = [&DIB](const Constant *CV) -> DIExpression * {
+        const APInt &API = dyn_cast<ConstantInt>(CV)->getValue();
+        std::optional<uint64_t> InitIntOpt;
+        if (API.isNonNegative())
+          InitIntOpt = API.tryZExtValue();
+        else if (auto Temp = API.trySExtValue(); Temp.has_value())
+          // Transform a signed optional to unsigned optional.
+          InitIntOpt = (uint64_t)Temp.value();
----------------
dwblaikie wrote:

Probably also favor `*` rather than `.value()` - not sure if we've clarified that in the style guide or not...

Oh, and the if condition could be simpler - no need to use `has_value` at all:
```
else if (auto Temp = API.trySExtValue())
```
Should suffice?

https://github.com/llvm/llvm-project/pull/66745


More information about the llvm-commits mailing list