From 64a9b5d3e6a604f770d26ae5d7b930c2154435c1 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 11 Jul 2017 05:39:20 +0000 Subject: [PATCH] [PM/ThinLTO] Fix PR33536, a bug where the ThinLTO bitcode writer was querying for analysis results on a function declaration rather than a definition. The only reason this worked previously is by chance -- because the way we got alias analysis results with the legacy PM, we happened to not compute a dominator tree and so we happened to not hit an assert even though it didn't make any real sense. Now we bail out before trying to compute alias analysis so that we don't hit these asserts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307625 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp | 3 +- .../ThinLTOBitcodeWriter/pr33536.ll | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/ThinLTOBitcodeWriter/pr33536.ll diff --git a/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp b/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp index 8d494fe9cde..8ef6bb65230 100644 --- a/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ b/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -271,7 +271,8 @@ void splitAndWriteThinLTOBitcode( if (!ArgT || ArgT->getBitWidth() > 64) return; } - if (computeFunctionBodyMemoryAccess(*F, AARGetter(*F)) == MAK_ReadNone) + if (!F->isDeclaration() && + computeFunctionBodyMemoryAccess(*F, AARGetter(*F)) == MAK_ReadNone) EligibleVirtualFns.insert(F); }); } diff --git a/test/Transforms/ThinLTOBitcodeWriter/pr33536.ll b/test/Transforms/ThinLTOBitcodeWriter/pr33536.ll new file mode 100644 index 00000000000..661d0739401 --- /dev/null +++ b/test/Transforms/ThinLTOBitcodeWriter/pr33536.ll @@ -0,0 +1,37 @@ +; Test for a bug specific to the new pass manager where we may build a domtree +; to make more precise AA queries for functions. +; +; RUN: opt -aa-pipeline=default -passes='no-op-module' -debug-pass-manager -thinlto-bc -o %t %s +; RUN: llvm-modextract -b -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=M0 %s +; RUN: llvm-modextract -b -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=M1 %s + +target triple = "x86_64-unknown-linux-gnu" + +%struct.hoge = type { %struct.widget } +%struct.widget = type { i32 (...)** } + +; M0: @global = local_unnamed_addr global +; M1-NOT: @global +@global = local_unnamed_addr global %struct.hoge { %struct.widget { i32 (...)** bitcast (i8** getelementptr inbounds ({ [3 x i8*] }, { [3 x i8*] }* @global.1, i32 0, inrange i32 0, i32 2) to i32 (...)**) } }, align 8 + +; M0: @global.1 = external unnamed_addr constant +; M1: @global.1 = linkonce_odr unnamed_addr constant +@global.1 = linkonce_odr unnamed_addr constant { [3 x i8*] } { [3 x i8*] [i8* null, i8* bitcast ({ i8*, i8* }* @global.4 to i8*), i8* bitcast (i32 (%struct.widget*)* @quux to i8*)] }, align 8, !type !0 + +; M0: @global.2 = external global +; M1-NOT: @global.2 +@global.2 = external global i8* + +; M0: @global.3 = linkonce_odr constant +; M1-NOT: @global.3 +@global.3 = linkonce_odr constant [22 x i8] c"zzzzzzzzzzzzzzzzzzzzz\00" + +; M0: @global.4 = linkonce_odr constant +; M1: @global.4 = external constant +@global.4 = linkonce_odr constant { i8*, i8* }{ i8* bitcast (i8** getelementptr inbounds (i8*, i8** @global.2, i64 2) to i8*), i8* getelementptr inbounds ([22 x i8], [22 x i8]* @global.3, i32 0, i32 0) } + +@llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer + +declare i32 @quux(%struct.widget*) unnamed_addr + +!0 = !{i64 16, !"yyyyyyyyyyyyyyyyyyyyyyyyy"}