Emit integer x<1 as x<=0, as comparisons with zero (now includeing
authorDan Gohman <gohman@apple.com>
Mon, 17 Sep 2007 14:49:27 +0000 (14:49 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 17 Sep 2007 14:49:27 +0000 (14:49 +0000)
64-bit) can use test instead of cmp with an immediate.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42026 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/cmp1.ll [new file with mode: 0644]

index 55f37a658465f56efd2b861ea27bb305fa9cb1bc..3b4b4f91750f28b4c51986858ecff7858b7bb377 100644 (file)
@@ -1546,6 +1546,11 @@ static bool translateX86CC(ISD::CondCode SetCCOpcode, bool isFP,
         // X < 0   -> X == 0, jump on sign.
         X86CC = X86::COND_S;
         return true;
+      } else if (SetCCOpcode == ISD::SETLT && RHSC->getValue() == 1) {
+        // X < 1   -> X <= 0
+        RHS = DAG.getConstant(0, RHS.getValueType());
+        X86CC = X86::COND_LE;
+        return true;
       }
     }
 
diff --git a/test/CodeGen/X86/cmp1.ll b/test/CodeGen/X86/cmp1.ll
new file mode 100644 (file)
index 0000000..241618c
--- /dev/null
@@ -0,0 +1,7 @@
+; RUN: llvm-as < %s | llc -march=x86-64 | grep -v cmp
+
+define i64 @foo(i64 %x) {
+  %t = icmp slt i64 %x, 1
+  %r = zext i1 %t to i64
+  ret i64 %r
+}