Index: llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp +++ llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp @@ -240,10 +240,17 @@ Changed = true; SE->forgetValue(&*I); I->replaceAllUsesWith(NewI); - // If SeenExprs constains I's WeakTrackingVH, that entry will be - // replaced with - // nullptr. + WeakVH NewIExist = NewI; + // If SeenExprs/NewIExist contains I's WeakTrackingVH/WeakVH, that + // entry will be replaced with nullptr if deleted. RecursivelyDeleteTriviallyDeadInstructions(&*I, TLI); + if (!NewIExist) { + // Rare occation where the new instruction (NewI) have been removed, + // probably due to parts of the input code was dead from the + // beginning, reset the iterator and start over from the beginning + I = BB->begin(); + continue; + } I = NewI->getIterator(); } // Add the rewritten instruction to SeenExprs; the original instruction Index: llvm/trunk/test/Transforms/NaryReassociate/pr37539.ll =================================================================== --- llvm/trunk/test/Transforms/NaryReassociate/pr37539.ll +++ llvm/trunk/test/Transforms/NaryReassociate/pr37539.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -nary-reassociate -S -o - | FileCheck %s + +; The test check that compilation does not segv (see pr37539). + +define void @f1() { +; CHECK-LABEL: @f1( +; CHECK-NEXT: br label %[[BB1:.*]] +; CHECK: [[BB1]] +; CHECK-NEXT: [[P1:%.*]] = phi i16 [ 0, [[TMP0:%.*]] ], [ [[A1:%.*]], %[[BB1]] ] +; CHECK-NEXT: [[SCEVGEP_OFFS:%.*]] = add i16 2, 0 +; CHECK-NEXT: [[A1]] = add i16 [[P1]], [[SCEVGEP_OFFS]] +; CHECK-NEXT: br i1 false, label %[[BB1]], label %[[BB7:.*]] +; CHECK: [[BB7]] +; CHECK-NEXT: ret void +; + br label %bb1 + +bb1: + %p1 = phi i16 [ 0, %0 ], [ %a1, %bb1 ] + %p2 = phi i16 [ 0, %0 ], [ %a2, %bb1 ] + %scevgep.offs = add i16 2, 0 + %a1 = add i16 %p1, %scevgep.offs + %scevgep.offs5 = add i16 2, 0 + %a2 = add i16 %p2, %scevgep.offs5 + br i1 false, label %bb1, label %bb7 + +bb7: + ret void +}