diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 3f0bf5b1a9b..79a48a6fd9c 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -1464,6 +1464,7 @@ TargetLowering::SimplifySetCC(MVT VT, SDValue N0, SDValue N1, // in the same partial word, see if we can shorten the load. if (DCI.isBeforeLegalize() && N0.getOpcode() == ISD::AND && C1 == 0 && + N0.getNode()->hasOneUse() && isa(N0.getOperand(0)) && N0.getOperand(0).getNode()->hasOneUse() && isa(N0.getOperand(1))) { diff --git a/test/CodeGen/X86/and-su.ll b/test/CodeGen/X86/and-su.ll new file mode 100644 index 00000000000..bdc845448f5 --- /dev/null +++ b/test/CodeGen/X86/and-su.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as < %s | llc -march=x86 | grep {(%} | count 1 + +; Don't duplicate the load. + +define fastcc i32 @foo(i32* %p) nounwind { + %t0 = load i32* %p + %t2 = and i32 %t0, 10 + %t3 = icmp ne i32 %t2, 0 + br i1 %t3, label %bb63, label %bb76 + +bb63: + ret i32 %t2 + +bb76: + ret i32 0 +}