[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 10:02:11 PDT 2019
pcc updated this revision to Diff 211540.
pcc added a comment.
- Check both operands of an add; follow GlobalAliases only
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D65115/new/
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,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
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.211540.patch
Type: text/x-patch
Size: 3340 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190724/562d874f/attachment.bin>
More information about the llvm-commits
mailing list