Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp @@ -17709,12 +17709,15 @@ if (AndRHSVal == 1 && AndLHS.getOpcode() == ISD::SRL) { LHS = AndLHS.getOperand(0); RHS = AndLHS.getOperand(1); - } - - // Use BT if the immediate can't be encoded in a TEST instruction. - if (!isUInt<32>(AndRHSVal) && isPowerOf2_64(AndRHSVal)) { - LHS = AndLHS; - RHS = DAG.getConstant(Log2_64_Ceil(AndRHSVal), dl, LHS.getValueType()); + } else { + // Use BT if the immediate can't be encoded in a TEST instruction or we + // are optimizing for size and the immedaite won't fit in a byte. + bool OptForSize = DAG.getMachineFunction().getFunction().optForSize(); + if ((!isUInt<32>(AndRHSVal) || (OptForSize && !isUInt<8>(AndRHSVal))) && + isPowerOf2_64(AndRHSVal)) { + LHS = AndLHS; + RHS = DAG.getConstant(Log2_64_Ceil(AndRHSVal), dl, LHS.getValueType()); + } } } Index: llvm/trunk/test/CodeGen/X86/test-vs-bittest.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/test-vs-bittest.ll +++ llvm/trunk/test/CodeGen/X86/test-vs-bittest.ll @@ -75,8 +75,8 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: pushq %rax ; CHECK-NEXT: .cfi_def_cfa_offset 16 -; CHECK-NEXT: testl $2048, %edi # imm = 0x800 -; CHECK-NEXT: je .LBB3_2 +; CHECK-NEXT: btl $11, %edi +; CHECK-NEXT: jae .LBB3_2 ; CHECK-NEXT: # %bb.1: # %yes ; CHECK-NEXT: callq bar ; CHECK-NEXT: .LBB3_2: # %no @@ -259,8 +259,8 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: pushq %rax ; CHECK-NEXT: .cfi_def_cfa_offset 16 -; CHECK-NEXT: testl $2048, %edi # imm = 0x800 -; CHECK-NEXT: je .LBB11_2 +; CHECK-NEXT: btl $11, %edi +; CHECK-NEXT: jae .LBB11_2 ; CHECK-NEXT: # %bb.1: # %yes ; CHECK-NEXT: callq bar ; CHECK-NEXT: .LBB11_2: # %no @@ -351,8 +351,8 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: pushq %rax ; CHECK-NEXT: .cfi_def_cfa_offset 16 -; CHECK-NEXT: testl $2048, %edi # imm = 0x800 -; CHECK-NEXT: je .LBB15_2 +; CHECK-NEXT: btl $11, %edi +; CHECK-NEXT: jae .LBB15_2 ; CHECK-NEXT: # %bb.1: # %yes ; CHECK-NEXT: callq bar ; CHECK-NEXT: .LBB15_2: # %no