[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
Wed Jul 24 15:22:39 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL366952: IR: Teach GlobalIndirectSymbol::getBaseObject() to handle more kinds of… (authored by pcc, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D65115?vs=211540&id=211613#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D65115/new/

https://reviews.llvm.org/D65115

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


Index: llvm/trunk/include/llvm/IR/GlobalIndirectSymbol.h
===================================================================
--- llvm/trunk/include/llvm/IR/GlobalIndirectSymbol.h
+++ llvm/trunk/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());
Index: llvm/trunk/test/Bitcode/thinlto-alias3.ll
===================================================================
--- llvm/trunk/test/Bitcode/thinlto-alias3.ll
+++ llvm/trunk/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/trunk/test/Linker/comdat8.ll
===================================================================
--- llvm/trunk/test/Linker/comdat8.ll
+++ llvm/trunk/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/trunk/lib/IR/Globals.cpp
===================================================================
--- llvm/trunk/lib/IR/Globals.cpp
+++ llvm/trunk/lib/IR/Globals.cpp
@@ -427,6 +427,43 @@
     Op<0>() = Symbol;
 }
 
+static const GlobalObject *
+findBaseObject(const Constant *C, DenseSet<const GlobalAlias *> &Aliases) {
+  if (auto *GO = dyn_cast<GlobalObject>(C))
+    return GO;
+  if (auto *GA = dyn_cast<GlobalAlias>(C))
+    if (Aliases.insert(GA).second)
+      return findBaseObject(GA->getOperand(0), Aliases);
+  if (auto *CE = dyn_cast<ConstantExpr>(C)) {
+    switch (CE->getOpcode()) {
+    case Instruction::Add: {
+      auto *LHS = findBaseObject(CE->getOperand(0), Aliases);
+      auto *RHS = findBaseObject(CE->getOperand(1), Aliases);
+      if (LHS && RHS)
+        return nullptr;
+      return LHS ? LHS : RHS;
+    }
+    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 GlobalAlias *> Aliases;
+  return findBaseObject(getOperand(0), Aliases);
+}
 
 //===----------------------------------------------------------------------===//
 // GlobalAlias Implementation


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65115.211613.patch
Type: text/x-patch
Size: 3438 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190724/c84093b9/attachment.bin>


More information about the llvm-commits mailing list