ValueMapper: Fix delayed blockaddress handling after r265273
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 6 Apr 2016 02:25:12 +0000 (02:25 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 6 Apr 2016 02:25:12 +0000 (02:25 +0000)
r265273 added Mapper::mapBlockAddress, which delays mapping a
blockaddress value until the function has a body.  The condition was
backwards, and should be checking Function::empty instead of
GlobalValue::isDeclaration.

llvm-svn: 265508

llvm/lib/Transforms/Utils/ValueMapper.cpp
llvm/test/Transforms/Inline/blockaddress.ll

index c6285de..0c2954f 100644 (file)
@@ -383,11 +383,11 @@ Value *Mapper::mapBlockAddress(const BlockAddress &BA) {
   // dummy basic block for now, and replace it once we've materialized all
   // the initializers.
   BasicBlock *BB;
-  if (F->isDeclaration()) {
-    BB = cast_or_null<BasicBlock>(mapValue(BA.getBasicBlock()));
-  } else {
+  if (F->empty()) {
     DelayedBBs.push_back(DelayedBasicBlock(BA));
     BB = DelayedBBs.back().TempBB.get();
+  } else {
+    BB = cast_or_null<BasicBlock>(mapValue(BA.getBasicBlock()));
   }
 
   return VM[&BA] = BlockAddress::get(F, BB ? BB : BA.getBasicBlock());
index 8eb3072..22ad882 100644 (file)
@@ -26,3 +26,25 @@ entry:
   call void @doit(i8** @ptr1, i32 %cond)
   ret void
 }
+
+; PR27233: We can inline @run into @init.  Don't crash on it.
+;
+; CHECK-LABEL: define void @init
+; CHECK:         store i8* blockaddress(@run, %bb)
+; CHECK-SAME:        @run.bb
+define void @init() {
+entry:
+  call void @run()
+  ret void
+}
+
+define void @run() {
+entry:
+  store i8* blockaddress(@run, %bb), i8** getelementptr inbounds ([1 x i8*], [1 x i8*]* @run.bb, i64 0, i64 0), align 8
+  ret void
+
+bb:
+  unreachable
+}
+
+@run.bb = global [1 x i8*] zeroinitializer