diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index a96f73df855..1df9a0d1700 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -617,7 +617,7 @@ X86DAGToDAGISel::IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const { // best of both worlds. if (U->getOpcode() == ISD::AND && Imm->getAPIntValue().getBitWidth() == 64 && - Imm->getAPIntValue().isSignedIntN(32)) + Imm->getAPIntValue().isIntN(32)) return false; // If this really a zext_inreg that can be represented with a movzx @@ -4282,6 +4282,7 @@ bool X86DAGToDAGISel::shrinkAndImmediate(SDNode *And) { // A negative mask allows a smaller encoding. Create a new 'and' node. SDValue NewMask = CurDAG->getConstant(NegMaskVal, SDLoc(And), VT); + insertDAGNode(*CurDAG, SDValue(And, 0), NewMask); SDValue NewAnd = CurDAG->getNode(ISD::AND, SDLoc(And), VT, And0, NewMask); ReplaceNode(And, NewAnd.getNode()); SelectCode(NewAnd.getNode()); diff --git a/test/CodeGen/X86/pr48458.ll b/test/CodeGen/X86/pr48458.ll index bca35596161..a446fa86d52 100644 --- a/test/CodeGen/X86/pr48458.ll +++ b/test/CodeGen/X86/pr48458.ll @@ -4,8 +4,8 @@ define i1 @foo(i64* %0) { ; CHECK-LABEL: foo: ; CHECK: # %bb.0: # %top -; CHECK-NEXT: movq (%rdi), %rax -; CHECK-NEXT: andq $-2147483648, %rax # imm = 0x80000000 +; CHECK-NEXT: movq $-2147483648, %rax # imm = 0x80000000 +; CHECK-NEXT: testq %rax, (%rdi) ; CHECK-NEXT: sete %al ; CHECK-NEXT: retq top: diff --git a/test/CodeGen/X86/pr48888.ll b/test/CodeGen/X86/pr48888.ll new file mode 100644 index 00000000000..d776d828e96 --- /dev/null +++ b/test/CodeGen/X86/pr48888.ll @@ -0,0 +1,36 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s + +define void @test(i64* %p) nounwind { +; CHECK-LABEL: test: +; CHECK: # %bb.0: # %bb +; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: andl $-2, %eax +; CHECK-NEXT: cmpq $2, %rax +; CHECK-NEXT: cmpl $2, %eax +; CHECK-NEXT: retq +bb: + %i = load i64, i64* %p, align 8, !range !0 + %i1 = and i64 %i, 6 + %i2 = icmp eq i64 %i1, 2 + br i1 %i2, label %bb3, label %bb5 + +bb3: ; preds = %bb + %i4 = icmp ne {}* undef, null + br label %bb5 + +bb5: ; preds = %bb3, %bb + br label %bb6 + +bb6: ; preds = %bb5 + br i1 %i2, label %bb7, label %bb9 + +bb7: ; preds = %bb6 + %i8 = getelementptr inbounds i64, i64* undef, i64 5 + br label %bb9 + +bb9: ; preds = %bb7, %bb6 + ret void +} + +!0 = !{i64 0, i64 5}