Problem with BranchFolder::OptimizeImpDefsBlock

This function removes implicit defs from blocks that have no other non-branch instructions, and where the registers defined in those implicit defs are not used by the branches. This creates a problem if the registers are actually live-in in some successor blocks.

Dead implicit defs should have been deleted by the time this code runs, and non-dead implicit defs should not be removed. I think this function should be deleted, but I'm wondering if anyone else has different ideas.

Below is a testcase and the outcome.


--- bug.ll ---
target triple = "hexagon"

define void @fred(i32 %p0) local_unnamed_addr align 2 {
   br i1 undef, label %b1, label %b2

b1: ; preds = %b0
   %t0 = load i8*, i8** undef, align 4
   br label %b2

b2: ; preds = %b1, %b0
   %t1 = phi i8* [ %t0, %b1 ], [ undef, %b0 ]
   %t2 = getelementptr inbounds i8, i8* %t1, i32 %p0
   tail call void @llvm.memmove.p0i8.p0i8.i32(i8* undef, i8* %t2, i32 undef, i32 1, i1 false) #1

declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) #0

attributes #0 = { argmemonly nounwind }
attributes #1 = { nounwind }