Index: llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp +++ llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp @@ -306,7 +306,11 @@ ValueVector &SV = Scattered[Op]; if (!SV.empty()) { for (unsigned I = 0, E = SV.size(); I != E; ++I) { - Instruction *Old = cast(SV[I]); + Value *V = SV[I]; + if (V == nullptr) + continue; + + Instruction *Old = cast(V); CV[I]->takeName(Old); Old->replaceAllUsesWith(CV[I]); Old->eraseFromParent(); Index: llvm/trunk/test/Transforms/Scalarizer/crash-bug.ll =================================================================== --- llvm/trunk/test/Transforms/Scalarizer/crash-bug.ll +++ llvm/trunk/test/Transforms/Scalarizer/crash-bug.ll @@ -0,0 +1,24 @@ +; RUN: opt %s -scalarizer -S -o - | FileCheck %s + +; Don't crash + +define void @foo() { + br label %bb1 + +bb2: ; preds = %bb1 + %bb2_vec = shufflevector <2 x i16> , + <2 x i16> %bb1_vec, + <2 x i32> + br label %bb1 + +bb1: ; preds = %bb2, %0 + %bb1_vec = phi <2 x i16> [ , %0 ], [ %bb2_vec, %bb2 ] +;CHECK: bb1: +;CHECK: %bb1_vec.i0 = phi i16 [ 100, %0 ], [ 0, %bb2 ] +;CHECK: %bb1_vec.i1 = phi i16 [ 200, %0 ], [ %bb1_vec.i1, %bb2 ] + br i1 undef, label %bb3, label %bb2 + +bb3: + ret void +} +