We currently use a callback to handle an IL pass deleting a BB that still

has a reference to it. Unfortunately, that doesn't work for codegen passes
since we don't get notified of MBB's being deleted (the original BB stays).

Use that fact to our advantage and after printing a function, check if
any of the IL BBs corresponds to a symbol that was not printed. This fixes
pr11202.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144674 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2011-11-15 19:08:46 +00:00
parent 1b71950812
commit 6c5b2dcd83
2 changed files with 31 additions and 0 deletions

View File

@ -736,6 +736,18 @@ void AsmPrinter::EmitFunctionBody() {
OutStreamer.EmitRawText(StringRef("\tnop\n"));
}
const Function *F = MF->getFunction();
for (Function::const_iterator i = F->begin(), e = F->end(); i != e; ++i) {
const BasicBlock *BB = i;
if (!BB->hasAddressTaken())
continue;
MCSymbol *Sym = GetBlockAddressSymbol(BB);
if (Sym->isDefined())
continue;
OutStreamer.AddComment("Address of block that was removed by CodeGen");
OutStreamer.EmitLabel(Sym);
}
// Emit target-specific gunk after the function body.
EmitFunctionBodyEnd();

View File

@ -0,0 +1,19 @@
; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s
@bb = constant [1 x i8*] [i8* blockaddress(@main, %l2)]
define void @main() {
entry:
br label %l1
l1: ; preds = %l2, %entry
%a = zext i1 false to i32
br label %l2
l2: ; preds = %l1
%b = zext i1 false to i32
br label %l1
}
; CHECK: .Ltmp1: # Address of block that was removed by CodeGen
; CHECK: .quad .Ltmp1