Index: llvm/lib/Transforms/Scalar/GVNHoist.cpp =================================================================== --- llvm/lib/Transforms/Scalar/GVNHoist.cpp +++ llvm/lib/Transforms/Scalar/GVNHoist.cpp @@ -605,9 +605,10 @@ if (safeToHoistScalar(BB, Insn->getParent(), NumBBsOnAllPaths)) Safe.push_back(CHI); } else { - MemoryUseOrDef *UD = MSSA->getMemoryAccess(Insn); - if (safeToHoistLdSt(BB->getTerminator(), Insn, UD, K, NumBBsOnAllPaths)) - Safe.push_back(CHI); + auto T = BB->getTerminator(); + if (MemoryUseOrDef *UD = MSSA->getMemoryAccess(Insn)) + if (safeToHoistLdSt(T, Insn, UD, K, NumBBsOnAllPaths)) + Safe.push_back(CHI); } } } Index: llvm/test/Transforms/GVNHoist/pr45442.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/GVNHoist/pr45442.ll @@ -0,0 +1,32 @@ +; RUN: opt < %s -gvn-hoist -S | FileCheck %s + +; gvn-hoist shouldn't crash in this case. +; CHECK-LABEL: @func(i1 %b) +; CHECK: entry: +; CHECK-NEXT: br i1 +; CHECK: bb1: +; CHECK-NEXT: ret void +; CHECK: bb2: +; CHECK-NEXT: call +; CHECK-NEXT: call +; CHECK-NEXT: ret void + +define void @v_1_0() #0 { +entry: + ret void +} + +define void @func(i1 %b) { +entry: + br i1 undef, label %bb1, label %bb2 + +bb1: + ret void + +bb2: + call void @v_1_0() + call void @v_1_0() + ret void +} + +attributes #0 = { nounwind readonly }