From: Dan Gohman Date: Thu, 5 Mar 2009 19:32:48 +0000 (+0000) Subject: Fix the "test" optimization to recognize "dec" as an add of X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4bfcf2a2a64785f3f0f0dd8fa6f4052d6cd7c08c;p=oota-llvm.git Fix the "test" optimization to recognize "dec" as an add of negative one, as subtracts of immediates are canonicalized to adds. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66180 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index d56e672e1f8..33eee7a7368 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -5382,13 +5382,19 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, SelectionDAG &DAG) { UE = Op.getNode()->use_end(); UI != UE; ++UI) if (UI->getOpcode() == ISD::STORE) goto default_case; - // An add of one will be selected as an INC. if (ConstantSDNode *C = - dyn_cast(Op.getNode()->getOperand(1))) + dyn_cast(Op.getNode()->getOperand(1))) { + // An add of one will be selected as an INC. if (C->getAPIntValue() == 1) { Opcode = X86ISD::INC; break; } + // An add of negative one (subtract of one) will be selected as a DEC. + if (C->getAPIntValue().isAllOnesValue()) { + Opcode = X86ISD::DEC; + break; + } + } // Otherwise use a regular EFLAGS-setting add. Opcode = X86ISD::ADD; break; @@ -5399,13 +5405,6 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, SelectionDAG &DAG) { UE = Op.getNode()->use_end(); UI != UE; ++UI) if (UI->getOpcode() == ISD::STORE) goto default_case; - // A subtract of one will be selected as a DEC. - if (ConstantSDNode *C = - dyn_cast(Op.getNode()->getOperand(1))) - if (C->getAPIntValue() == 1) { - Opcode = X86ISD::DEC; - break; - } // Otherwise use a regular EFLAGS-setting sub. Opcode = X86ISD::SUB; break; diff --git a/test/CodeGen/X86/peep-test-0.ll b/test/CodeGen/X86/peep-test-0.ll new file mode 100644 index 00000000000..a95b5640443 --- /dev/null +++ b/test/CodeGen/X86/peep-test-0.ll @@ -0,0 +1,22 @@ +; RUN: llvm-as < %s | llc -march=x86-64 > %t +; RUN: not grep cmp %t +; RUN: not grep test %t + +define void @loop(i64 %n, double* nocapture %d) nounwind { +entry: + br label %bb + +bb: + %indvar = phi i64 [ %n, %entry ], [ %indvar.next, %bb ] + %i.03 = add i64 %indvar, %n + %0 = getelementptr double* %d, i64 %i.03 + %1 = load double* %0, align 8 + %2 = mul double %1, 3.000000e+00 + store double %2, double* %0, align 8 + %indvar.next = add i64 %indvar, 1 + %exitcond = icmp eq i64 %indvar.next, 0 + br i1 %exitcond, label %return, label %bb + +return: + ret void +} diff --git a/test/CodeGen/X86/peep-test-1.ll b/test/CodeGen/X86/peep-test-1.ll new file mode 100644 index 00000000000..b4698e37b42 --- /dev/null +++ b/test/CodeGen/X86/peep-test-1.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | llc -march=x86 > %t +; RUN: grep dec %t | count 1 +; RUN: not grep test %t +; RUN: not grep cmp %t + +define void @foo(i32 %n, double* nocapture %p) nounwind { + br label %bb + +bb: + %indvar = phi i32 [ 0, %0 ], [ %indvar.next, %bb ] + %i.03 = sub i32 %n, %indvar + %1 = getelementptr double* %p, i32 %i.03 + %2 = load double* %1, align 4 + %3 = mul double %2, 2.930000e+00 + store double %3, double* %1, align 4 + %4 = add i32 %i.03, -1 + %phitmp = icmp slt i32 %4, 0 + %indvar.next = add i32 %indvar, 1 + br i1 %phitmp, label %bb, label %return + +return: + ret void +} diff --git a/test/CodeGen/X86/peep-test.ll b/test/CodeGen/X86/peep-test.ll deleted file mode 100644 index a95b5640443..00000000000 --- a/test/CodeGen/X86/peep-test.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: llvm-as < %s | llc -march=x86-64 > %t -; RUN: not grep cmp %t -; RUN: not grep test %t - -define void @loop(i64 %n, double* nocapture %d) nounwind { -entry: - br label %bb - -bb: - %indvar = phi i64 [ %n, %entry ], [ %indvar.next, %bb ] - %i.03 = add i64 %indvar, %n - %0 = getelementptr double* %d, i64 %i.03 - %1 = load double* %0, align 8 - %2 = mul double %1, 3.000000e+00 - store double %2, double* %0, align 8 - %indvar.next = add i64 %indvar, 1 - %exitcond = icmp eq i64 %indvar.next, 0 - br i1 %exitcond, label %return, label %bb - -return: - ret void -}