diff --git a/lib/CodeGen/StackProtector.cpp b/lib/CodeGen/StackProtector.cpp index fcaee4208ba..02d8fd6dea9 100644 --- a/lib/CodeGen/StackProtector.cpp +++ b/lib/CodeGen/StackProtector.cpp @@ -219,8 +219,8 @@ bool StackProtector::InsertStackProtectors() { // Split the basic block before the return instruction. BasicBlock *NewBB = BB->splitBasicBlock(RI, "SP_return"); - if (DT) { - DT->addNewBlock(NewBB, DT->isReachableFromEntry(BB) ? BB : 0); + if (DT && DT->isReachableFromEntry(BB)) { + DT->addNewBlock(NewBB, BB); FailBBDom = DT->findNearestCommonDominator(FailBBDom, BB); } @@ -242,7 +242,7 @@ bool StackProtector::InsertStackProtectors() { // statements in the function. if (!FailBB) return false; - if (DT) + if (DT && FailBBDom) DT->addNewBlock(FailBB, FailBBDom); return true; diff --git a/test/CodeGen/X86/unreachable-stack-protector.ll b/test/CodeGen/X86/unreachable-stack-protector.ll new file mode 100644 index 00000000000..eeebceea71d --- /dev/null +++ b/test/CodeGen/X86/unreachable-stack-protector.ll @@ -0,0 +1,19 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-apple-darwin10.0.0" + +declare i64 @llvm.objectsize.i64(i8*, i1) nounwind readnone + +define void @test5() nounwind optsize noinline ssp { +entry: +; CHECK: movq ___stack_chk_guard@GOTPCREL(%rip) + %buf = alloca [64 x i8], align 16 + %0 = call i64 @llvm.objectsize.i64(i8* undef, i1 false) + br i1 false, label %if.end, label %if.then + +if.then: ; preds = %entry + unreachable + +if.end: ; preds = %entry + ret void +}