Index: lib/CodeGen/IfConversion.cpp =================================================================== --- lib/CodeGen/IfConversion.cpp +++ lib/CodeGen/IfConversion.cpp @@ -646,7 +646,8 @@ if (TII->DefinesPredicate(*TIB, PredDefs)) return false; // If we get all the way to the branch instructions, don't count them. - if (!TIB->isBranch()) + // We treat returns as unconditional branches + if (!(TIB->isBranch() || TIB->isReturn())) ++Dups1; ++TIB; ++FIB; @@ -685,7 +686,7 @@ break; // We have to verify that any branch instructions are the same, and then we // don't count them toward the # of duplicate instructions. - if (!RTIE->isBranch()) + if (!(RTIE->isBranch() || RTIE->isReturn())) ++Dups2; ++RTIE; ++RFIE; Index: test/CodeGen/MIR/PowerPC/ifcvt-diamond-ret.mir =================================================================== --- /dev/null +++ test/CodeGen/MIR/PowerPC/ifcvt-diamond-ret.mir @@ -0,0 +1,36 @@ +# RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -run-pass=if-converter %s -o - | FileCheck %s +--- +name: foo +body: | + bb.0: + liveins: $x0, $x3 + successors: %bb.1(0x40000000), %bb.2(0x40000000) + + dead renamable $x3 = ANDIo8 killed renamable $x3, 1, implicit-def dead $cr0, implicit-def $cr0gt + $cr2lt = CROR $cr0gt, $cr0gt + BCn killed renamable $cr2lt, %bb.2 + B %bb.1 + + bb.1: + renamable $x3 = LIS8 4096 + MTLR8 $x0, implicit-def $lr8 + BLR8 implicit $lr8, implicit $rm, implicit $x3 + + bb.2: + renamable $x3 = LIS8 4096 + MTLR8 $x0, implicit-def $lr8 + BLR8 implicit $lr8, implicit $rm, implicit $x3 +... + +# Diamond testcase with branches terminating in returns, + +# CHECK: body: | +# CHECK: bb.0: +# CHECK: dead renamable $x3 = ANDIo8 killed renamable $x3, 1, implicit-def dead $cr0, implicit-def $cr0gt +# CHECK: $cr2lt = CROR $cr0gt, $cr0gt +# CHECK: renamable $x3 = LIS8 4096 +# CHECK: MTLR8 $x0, implicit-def $lr8 +# CHECK: BCLRn $cr2lt, implicit $lr8, implicit $rm, implicit $x3 +# CHECK: BCLR $cr2lt, implicit $lr8, implicit $rm, implicit $x3 + +