From 3cc48a062821557a2ccaa8df26dd3a98d64c44b9 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Tue, 8 Jan 2013 10:51:32 +0000 Subject: [PATCH] Make sure we don't emit instructions before a landingpad instruction. PR14782 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171846 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/DemoteRegToStack.cpp | 7 +- test/Transforms/Reg2Mem/crash.ll | 88 +++++++++++++++++++++++ test/Transforms/Reg2Mem/lit.local.cfg | 1 + 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/Reg2Mem/crash.ll create mode 100644 test/Transforms/Reg2Mem/lit.local.cfg diff --git a/lib/Transforms/Utils/DemoteRegToStack.cpp b/lib/Transforms/Utils/DemoteRegToStack.cpp index ee59e946551c..d5c41f545947 100644 --- a/lib/Transforms/Utils/DemoteRegToStack.cpp +++ b/lib/Transforms/Utils/DemoteRegToStack.cpp @@ -124,7 +124,12 @@ AllocaInst *llvm::DemotePHIToStack(PHINode *P, Instruction *AllocaPoint) { } // Insert a load in place of the PHI and replace all uses. - Value *V = new LoadInst(Slot, P->getName()+".reload", P); + BasicBlock::iterator InsertPt = P; + + for (; isa(InsertPt) || isa(InsertPt); ++InsertPt) + /* empty */; // Don't insert before PHI nodes or landingpad instrs. + + Value *V = new LoadInst(Slot, P->getName()+".reload", InsertPt); P->replaceAllUsesWith(V); // Delete PHI. diff --git a/test/Transforms/Reg2Mem/crash.ll b/test/Transforms/Reg2Mem/crash.ll new file mode 100644 index 000000000000..02fed94b8527 --- /dev/null +++ b/test/Transforms/Reg2Mem/crash.ll @@ -0,0 +1,88 @@ +; RUN: opt -reg2mem -disable-output < %s +; PR14782 + +declare void @f1() + +declare i32 @__gxx_personality_sj0(...) + +declare void @f2() + +declare void @f3() + +declare void @f4_() + +declare void @_Z12xxxdtsP10xxxpq() + +define hidden void @_ZN12xxxyzIi9xxxwLi29ELi0EE4f3NewES0_i() ssp align 2 { +bb: + invoke void @f4_() + to label %bb1 unwind label %.thread + +.thread: ; preds = %bb + %tmp = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %bb13 + +bb1: ; preds = %bb + invoke void @f1() + to label %.noexc unwind label %bb10 + +.noexc: ; preds = %bb1 + invoke void @f4_() + to label %bb6 unwind label %bb2 + +bb2: ; preds = %.noexc + %tmp3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + invoke void @f3() + to label %.body unwind label %bb4 + +bb4: ; preds = %bb2 + %tmp5 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + unreachable + +bb6: ; preds = %.noexc + invoke void @_Z12xxxdtsP10xxxpq() + to label %_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit unwind label %bb10 + +_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit: ; preds = %bb6 + invoke void @f2() + to label %bb7 unwind label %bb8 + +bb7: ; preds = %_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit + ret void + +bb8: ; preds = %_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit + %tmp9 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %_ZN10xxxpqdlev.exit + +bb10: ; preds = %bb6, %bb1 + %.1 = phi i1 [ true, %bb1 ], [ false, %bb6 ] + %tmp11 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %.body + +.body: ; preds = %bb10, %bb2 + %.1.lpad-body = phi i1 [ %.1, %bb10 ], [ true, %bb2 ] + invoke void @f2() + to label %bb12 unwind label %bb14 + +bb12: ; preds = %.body + br i1 %.1.lpad-body, label %bb13, label %_ZN10xxxpqdlev.exit + +bb13: ; preds = %bb12, %.thread + invoke void @xxx_MemFree() + to label %_ZN10xxxpqdlev.exit unwind label %bb14 + +_ZN10xxxpqdlev.exit: ; preds = %bb13, %bb12, %bb8 + resume { i8*, i32 } undef + +bb14: ; preds = %bb13, %.body + %tmp15 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + unreachable +} + +declare void @xxx_MemFree() diff --git a/test/Transforms/Reg2Mem/lit.local.cfg b/test/Transforms/Reg2Mem/lit.local.cfg new file mode 100644 index 000000000000..19eebc0ac7ac --- /dev/null +++ b/test/Transforms/Reg2Mem/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.ll', '.c', '.cpp']