[PATCH] D65115: IR: Teach GlobalIndirectSymbol::getBaseObject() to handle more kinds of expressions.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 22 14:18:23 PDT 2019


pcc created this revision.
pcc added a reviewer: tejohnson.
Herald added subscribers: dexonsmith, steven_wu, hiraditya, mehdi_amini.
Herald added a project: LLVM.

For aliases, any expression that lowers at the MC level to global_object or
global_object+constant is valid at the object file level. getBaseObject()
should return a result if the aliasee ends up being of that form even if
the IR used to produce it is somewhat unconventional.

Note that this is different from what stripInBoundsOffsets() and that family
of functions is doing. Those functions are concerned about semantic properties
of IR, whereas here we only care about the lowering result.

Therefore reimplement getBaseObject() in a way that matches the lowering
result. This fixes a crash when producing a summary for aliases such as
that in the included test case.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D65115

Files:
  llvm/include/llvm/IR/GlobalIndirectSymbol.h
  llvm/lib/IR/Globals.cpp
  llvm/test/Bitcode/thinlto-alias3.ll
  llvm/test/Linker/comdat8.ll


Index: llvm/test/Linker/comdat8.ll
===================================================================
--- llvm/test/Linker/comdat8.ll
+++ llvm/test/Linker/comdat8.ll
@@ -2,7 +2,7 @@
 
 $c1 = comdat largest
 
- at some_name = private unnamed_addr constant i32 42, comdat($c1)
- at c1 = alias i8, inttoptr (i32 ptrtoint (i32* @some_name to i32) to i8*)
+ at some_name = unnamed_addr constant i32 42, comdat($c1)
+ at c1 = alias i8, inttoptr (i32 1 to i8*)
 
 ; CHECK: COMDAT key involves incomputable alias size.
Index: llvm/test/Bitcode/thinlto-alias3.ll
===================================================================
--- /dev/null
+++ llvm/test/Bitcode/thinlto-alias3.ll
@@ -0,0 +1,11 @@
+; Test that inttoptr, add and ptrtoint don't cause problems in alias summaries.
+; RUN: opt -module-summary %s -o - | llvm-dis | FileCheck %s
+
+; CHECK: ^1 = gv: (name: "a", {{.*}} aliasee: ^2
+; CHECK: ^2 = gv: (name: "b",
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+ at a = alias i32, i32* inttoptr (i64 add (i64 ptrtoint (i32* @b to i64), i64 1297036692682702848) to i32*)
+ at b = global i32 1
Index: llvm/lib/IR/Globals.cpp
===================================================================
--- llvm/lib/IR/Globals.cpp
+++ llvm/lib/IR/Globals.cpp
@@ -427,6 +427,42 @@
     Op<0>() = Symbol;
 }
 
+static const GlobalObject *
+findBaseObject(const Constant *C,
+               DenseSet<const GlobalIndirectSymbol *> &Aliases) {
+  if (auto *GO = dyn_cast<GlobalObject>(C))
+    return GO;
+  if (auto *GIS = dyn_cast<GlobalIndirectSymbol>(C))
+    if (Aliases.insert(GIS).second)
+      return findBaseObject(GIS->getOperand(0), Aliases);
+  if (auto *CE = dyn_cast<ConstantExpr>(C)) {
+    switch (CE->getOpcode()) {
+    case Instruction::Add: {
+      if (auto *GIS = findBaseObject(CE->getOperand(0), Aliases))
+        return GIS;
+      return findBaseObject(CE->getOperand(1), Aliases);
+    }
+    case Instruction::Sub: {
+      if (findBaseObject(CE->getOperand(1), Aliases))
+        return nullptr;
+      return findBaseObject(CE->getOperand(0), Aliases);
+    }
+    case Instruction::IntToPtr:
+    case Instruction::PtrToInt:
+    case Instruction::BitCast:
+    case Instruction::GetElementPtr:
+      return findBaseObject(CE->getOperand(0), Aliases);
+    default:
+      break;
+    }
+  }
+  return nullptr;
+}
+
+const GlobalObject *GlobalIndirectSymbol::getBaseObject() const {
+  DenseSet<const GlobalIndirectSymbol *> Aliases;
+  return findBaseObject(getOperand(0), Aliases);
+}
 
 //===----------------------------------------------------------------------===//
 // GlobalAlias Implementation
Index: llvm/include/llvm/IR/GlobalIndirectSymbol.h
===================================================================
--- llvm/include/llvm/IR/GlobalIndirectSymbol.h
+++ llvm/include/llvm/IR/GlobalIndirectSymbol.h
@@ -54,9 +54,7 @@
           static_cast<const GlobalIndirectSymbol *>(this)->getIndirectSymbol());
   }
 
-  const GlobalObject *getBaseObject() const {
-    return dyn_cast<GlobalObject>(getIndirectSymbol()->stripInBoundsOffsets());
-  }
+  const GlobalObject *getBaseObject() const;
   GlobalObject *getBaseObject() {
     return const_cast<GlobalObject *>(
               static_cast<const GlobalIndirectSymbol *>(this)->getBaseObject());


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65115.211189.patch
Type: text/x-patch
Size: 3327 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190722/274f1ee4/attachment.bin>


More information about the llvm-commits mailing list