From 592d439efee50c81b44285ea718c881281320ce0 Mon Sep 17 00:00:00 2001 From: Andrea Di Biagio Date: Mon, 9 Jun 2014 12:34:50 +0000 Subject: [X86] Avoid emitting unnecessary test instructions. This patch teaches the backend how to check for the 'NoSignedWrap' flag on binary operations to improve the emission of 'test' instructions. If the result of a binary operation is known not to overflow we know that resetting the Overflow flag is unnecessary and so we can avoid emitting the test instruction. Patch by Marcello Maggioni. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210468 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/CodeGen/X86/2014-05-29-factorial.ll | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 test/CodeGen/X86/2014-05-29-factorial.ll (limited to 'test/CodeGen/X86/2014-05-29-factorial.ll') diff --git a/test/CodeGen/X86/2014-05-29-factorial.ll b/test/CodeGen/X86/2014-05-29-factorial.ll new file mode 100644 index 0000000000..70255bd321 --- /dev/null +++ b/test/CodeGen/X86/2014-05-29-factorial.ll @@ -0,0 +1,24 @@ +; RUN: llc < %s -march=x86-64 | FileCheck %s +; CHECK: decq %rdi +; CHECK-NOT: testq %rdi, %rdi + +define i64 @fact2(i64 %x) { +entry: + br label %while.body + +while.body: + %result.06 = phi i64 [ %mul, %while.body ], [ 1, %entry ] + %x.addr.05 = phi i64 [ %dec, %while.body ], [ %x, %entry ] + %mul = mul nsw i64 %result.06, %x.addr.05 + %dec = add nsw i64 %x.addr.05, -1 + %cmp = icmp sgt i64 %dec, 0 + br i1 %cmp, label %while.body, label %while.end.loopexit + +while.end.loopexit: + %mul.lcssa = phi i64 [ %mul, %while.body ] + br label %while.end + +while.end: + %result.0.lcssa = phi i64 [ %mul.lcssa, %while.end.loopexit ] + ret i64 %result.0.lcssa +} -- cgit v1.2.3