Index: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -1880,6 +1880,9 @@ // Diamond: TBB is the block that is branched to, FBB is the fallthrough TUnpredCycles = TCycles + TakenBranchCost; FUnpredCycles = FCycles + NotTakenBranchCost; + // The branch at the end of FBB will disappear when it's predicated, so + // discount it from PredCost. + PredCost -= 1 * ScalingUpFactor; } // The total cost is the cost of each path scaled by their probabilites unsigned TUnpredCost = Probability.scale(TUnpredCycles * ScalingUpFactor); Index: llvm/trunk/test/CodeGen/Thumb2/ifcvt-no-branch-predictor.ll =================================================================== --- llvm/trunk/test/CodeGen/Thumb2/ifcvt-no-branch-predictor.ll +++ llvm/trunk/test/CodeGen/Thumb2/ifcvt-no-branch-predictor.ll @@ -95,15 +95,17 @@ } ; CHECK-LABEL: diamond2: -; CHECK-BP: itte -; CHECK-BP: streq -; CHECK-BP: ldreq -; CHECK-BP: strne -; CHECK-NOBP: cbz -; CHECK-NOBP: str -; CHECK-NOBP: b -; CHECK-NOBP: str -; CHECK-NOBP: ldr +; CHECK-BP: cbz +; CHECK-BP: str +; CHECK-BP: str +; CHECK-BP: b +; CHECK-BP: str +; CHECK-BP: ldr +; CHECK-NOBP: ittee +; CHECK-NOBP: streq +; CHECK-NOBP: ldreq +; CHECK-NOBP: strne +; CHECK-NOBP: strne define i32 @diamond2(i32 %n, i32 %m, i32* %p, i32* %q) { entry: %tobool = icmp eq i32 %n, 0 @@ -111,6 +113,8 @@ if.then: store i32 %n, i32* %p, align 4 + %arrayidx = getelementptr inbounds i32, i32* %p, i32 2 + store i32 %n, i32* %arrayidx, align 4 br label %if.end if.else: