Index: llvm/trunk/lib/CodeGen/IfConversion.cpp =================================================================== --- llvm/trunk/lib/CodeGen/IfConversion.cpp +++ llvm/trunk/lib/CodeGen/IfConversion.cpp @@ -1689,10 +1689,15 @@ // Remove the conditional branch from entry to the blocks. BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); - // Initialize liveins to the first BB. These are potentially redefined by - // predicated instructions. + // Initialize the Redefs: + // - BB2 live-in regs need implicit uses before being redefined by BB1 + // instructions. + // - BB1 live-out regs need implicit uses before being redefined by BB2 + // instructions. We start with BB1 live-ins so we have the live-out regs + // after tracking the BB1 instructions. Redefs.init(TRI); Redefs.addLiveIns(*BBI1->BB); + Redefs.addLiveIns(*BBI2->BB); // Remove the duplicated instructions at the beginnings of both paths. // Skip dbg_value instructions Index: llvm/trunk/test/CodeGen/Hexagon/ifcvt-impuse-livein.mir =================================================================== --- llvm/trunk/test/CodeGen/Hexagon/ifcvt-impuse-livein.mir +++ llvm/trunk/test/CodeGen/Hexagon/ifcvt-impuse-livein.mir @@ -0,0 +1,43 @@ +# RUN: llc -march=hexagon -run-pass if-converter %s -o - | FileCheck %s + +# Make sure that the necessary implicit uses are added to predicated +# instructions. + +# CHECK-LABEL: name: foo + +--- | + define void @foo() { + ret void + } +... + +--- +name: foo +tracksRegLiveness: true +allVRegsAllocated: true +body: | + bb.0: + successors: %bb.1, %bb.2 + liveins: %r0, %r2, %p1 + J2_jumpf %p1, %bb.1, implicit-def %pc + J2_jump %bb.2, implicit-def %pc + bb.1: + successors: %bb.3 + liveins: %r2 + %r0 = A2_tfrsi 2 + J2_jump %bb.3, implicit-def %pc + bb.2: + successors: %bb.3 + liveins: %r0 + ; Even though r2 was not live on entry to this block, it was live across + ; block bb.1 in the original diamond. After if-conversion, the diamond + ; became a single block, and so r2 is now live on entry to the instructions + ; originating from bb.2. + ; CHECK: %r2 = C2_cmoveit %p1, 1, implicit %r2 + %r2 = A2_tfrsi 1 + bb.3: + liveins: %r0, %r2 + %r0 = A2_add %r0, %r2 + J2_jumpr %r31, implicit-def %pc +... +