Index: llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp +++ llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -625,6 +625,17 @@ E = CurDAG->allnodes_end(); I != E; ) { SDNode *N = &*I++; // Preincrement iterator to avoid invalidation issues. + // If this is a target specific AND node with no flag usages, turn it back + // into ISD::AND to enable test instruction matching. + if (N->getOpcode() == X86ISD::AND && !N->hasAnyUseOfValue(1)) { + SDValue Res = CurDAG->getNode(ISD::AND, SDLoc(N), N->getValueType(0), + N->getOperand(0), N->getOperand(1)); + --I; + CurDAG->ReplaceAllUsesOfValueWith(SDValue(N, 0), Res); + ++I; + CurDAG->DeleteNode(N); + } + if (OptLevel != CodeGenOpt::None && // Only do this when the target can fold the load into the call or // jmp. Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp @@ -17365,7 +17365,8 @@ if (TLI.isOperationLegal(WideVal.getOpcode(), WideVT)) { SDValue V0 = DAG.getNode(ISD::TRUNCATE, dl, VT, WideVal.getOperand(0)); SDValue V1 = DAG.getNode(ISD::TRUNCATE, dl, VT, WideVal.getOperand(1)); - Op = DAG.getNode(ConvertedOp, dl, VT, V0, V1); + SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::i32); + Op = DAG.getNode(ConvertedOp, dl, VTs, V0, V1); } } } @@ -17383,7 +17384,7 @@ SmallVector Ops(Op->op_begin(), Op->op_begin() + NumOperands); SDValue New = DAG.getNode(Opcode, dl, VTs, Ops); - DAG.ReplaceAllUsesWith(Op, New); + DAG.ReplaceAllUsesOfValueWith(SDValue(Op.getNode(), 0), New); return SDValue(New.getNode(), 1); } Index: llvm/trunk/test/CodeGen/X86/2012-08-16-setcc.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/2012-08-16-setcc.ll +++ llvm/trunk/test/CodeGen/X86/2012-08-16-setcc.ll @@ -7,7 +7,7 @@ ; CHECK-LABEL: and_1: ; CHECK: # %bb.0: ; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: andb %dil, %sil +; CHECK-NEXT: testb %dil, %sil ; CHECK-NEXT: cmovnel %edx, %eax ; CHECK-NEXT: retq %1 = and i8 %b, %a @@ -19,7 +19,7 @@ define zeroext i1 @and_2(i8 zeroext %a, i8 zeroext %b) { ; CHECK-LABEL: and_2: ; CHECK: # %bb.0: -; CHECK-NEXT: andb %dil, %sil +; CHECK-NEXT: testb %dil, %sil ; CHECK-NEXT: setne %al ; CHECK-NEXT: retq %1 = and i8 %b, %a Index: llvm/trunk/test/CodeGen/X86/jump_sign.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/jump_sign.ll +++ llvm/trunk/test/CodeGen/X86/jump_sign.ll @@ -402,8 +402,7 @@ ; CHECK-NEXT: cmpl {{[0-9]+}}(%esp), %eax ; CHECK-NEXT: setb %cl ; CHECK-NEXT: movl a, %eax -; CHECK-NEXT: movl %eax, %edx -; CHECK-NEXT: andb %cl, %dl +; CHECK-NEXT: testb %al, %cl ; CHECK-NEXT: je .LBB18_2 ; CHECK-NEXT: # %bb.1: # %if.then ; CHECK-NEXT: decl %eax Index: llvm/trunk/test/CodeGen/X86/test-shrink-bug.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/test-shrink-bug.ll +++ llvm/trunk/test/CodeGen/X86/test-shrink-bug.ll @@ -68,7 +68,7 @@ ; CHECK-X64: # %bb.0: ; CHECK-X64-NEXT: pushq %rax ; CHECK-X64-NEXT: .cfi_def_cfa_offset 16 -; CHECK-X64-NEXT: andw $263, %di # imm = 0x107 +; CHECK-X64-NEXT: testw $263, %di # imm = 0x107 ; CHECK-X64-NEXT: je .LBB1_2 ; CHECK-X64-NEXT: # %bb.1: ; CHECK-X64-NEXT: pand {{.*}}(%rip), %xmm0