Index: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp =================================================================== --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3666,10 +3666,15 @@ Tmp2.getOperand(0), Tmp2.getOperand(1), Node->getOperand(2)); } else { - // We test only the i1 bit. Skip the AND if UNDEF. - Tmp3 = (Tmp2.isUndef()) ? Tmp2 : - DAG.getNode(ISD::AND, dl, Tmp2.getValueType(), Tmp2, - DAG.getConstant(1, dl, Tmp2.getValueType())); + // We test only the i1 bit. Skip the AND if UNDEF or another AND. + if (Tmp2.isUndef() || + (Tmp2.getOpcode() == ISD::AND && + isa(Tmp2.getOperand(1)) && + dyn_cast(Tmp2.getOperand(1))->getZExtValue() == 1)) + Tmp3 = Tmp2; + else + Tmp3 = DAG.getNode(ISD::AND, dl, Tmp2.getValueType(), Tmp2, + DAG.getConstant(1, dl, Tmp2.getValueType())); Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1, DAG.getCondCode(ISD::SETNE), Tmp3, DAG.getConstant(0, dl, Tmp3.getValueType()), Index: test/CodeGen/ARM/wide-compares.ll =================================================================== --- test/CodeGen/ARM/wide-compares.ll +++ test/CodeGen/ARM/wide-compares.ll @@ -36,11 +36,7 @@ ; CHECK-ARM: sbcs {{[^,]+}}, r1, r3 ; CHECK-THUMB2: subs {{[^,]+}}, r0, r2 ; CHECK-THUMB2: sbcs.w {{[^,]+}}, r1, r3 - ; CHECK-ARM: movwge r12, #1 - ; CHECK-ARM: cmp r12, #0 - ; CHECK-THUMB2: movge.w r12, #1 - ; CHECK-THUMB: cmp.w r12, #0 - ; CHECK: bne [[BB2:\.[0-9A-Za-z_]+]] + ; CHECK: bge [[BB2:\.[0-9A-Za-z_]+]] br i1 %cmp, label %bb1, label %bb2 bb1: call void @f()