re PR target/88425 (suboptimal code for a<imm?-1:0)
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 Dec 2018 14:50:22 +0000 (15:50 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Dec 2018 14:50:22 +0000 (15:50 +0100)
PR target/88425
* config/i386/i386.md (*x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>):
New define_insn_and_split.

* gcc.target/i386/pr88425.c: New test.

From-SVN: r267023

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr88425.c [new file with mode: 0644]

index a40b365be283017302e66ecf4bb5fc2ad77851c0..31cafdca13eef71a8eebba92c4f9612678076fb7 100644 (file)
@@ -1,3 +1,9 @@
+2018-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/88425
+       * config/i386/i386.md (*x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>):
+       New define_insn_and_split.
+
 2018-12-11  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/88448
index 37a92f5bb30bf6fe1450234b647b8ab5f38de6af..800b64917dc85c6d874dc9e7e420b272977bc358 100644 (file)
    (set_attr "mode" "<MODE>")
    (set_attr "length_immediate" "0")])
 
+(define_insn_and_split "*x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>"
+  [(set (match_operand:SWI48 0 "register_operand" "=r")
+       (neg:SWI48
+         (leu:SWI48
+           (match_operand:SWI 1 "nonimmediate_operand" "<SWI:r>m")
+           (match_operand:SWI 2 "<SWI:immediate_operand>" "<SWI:i>"))))
+   (clobber (reg:CC FLAGS_REG))]
+  "CONST_INT_P (operands[2])
+   && INTVAL (operands[2]) != -1
+   && INTVAL (operands[2]) != 2147483647"
+  "#"
+  ""
+  [(set (reg:CC FLAGS_REG) (compare:CC (match_dup 1) (match_dup 2)))
+   (parallel [(set (match_dup 0)
+                  (neg:SWI48 (ltu:SWI48 (reg:CC FLAGS_REG) (const_int 0))))
+             (clobber (reg:CC FLAGS_REG))])]
+  "operands[2] = GEN_INT (INTVAL (operands[2]) + 1);")
+
 (define_insn "*mov<mode>cc_noc"
   [(set (match_operand:SWI248 0 "register_operand" "=r,r")
        (if_then_else:SWI248 (match_operator 1 "ix86_comparison_operator"
index 52804b4b8b6d3a810b61fb7e84ac30f5edf0320a..12acfe31ad54d9e9e3e89cbd77e93b1b98bfe3dd 100644 (file)
@@ -1,5 +1,8 @@
 2018-12-11  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/88425
+       * gcc.target/i386/pr88425.c: New test.
+
        PR sanitizer/88426
        * c-c++-common/ubsan/float-cast-overflow-11.c: New test.
 
diff --git a/gcc/testsuite/gcc.target/i386/pr88425.c b/gcc/testsuite/gcc.target/i386/pr88425.c
new file mode 100644 (file)
index 0000000..e0df560
--- /dev/null
@@ -0,0 +1,53 @@
+/* PR target/88425 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -masm=att" } */
+/* { dg-final { scan-assembler-times "sbb\[lq]\[ \t]" 8 } } */
+/* { dg-final { scan-assembler-not "setbe\[ \t]" } } */
+
+unsigned long
+f1 (unsigned long x)
+{
+  return x < 123UL ? -1UL : 0;
+}
+
+unsigned long
+f2 (unsigned int x)
+{
+  return x < 12345U ? -1UL : 0;
+}
+
+unsigned long
+f3 (unsigned short *x)
+{
+  return x[0] < 1234U ? -1UL : 0;
+}
+
+unsigned long
+f4 (unsigned char *x)
+{
+  return x[0] < 123U ? -1UL : 0;
+}
+
+unsigned int
+f5 (unsigned long x)
+{
+  return x < 123UL ? -1U : 0;
+}
+
+unsigned int
+f6 (unsigned int x)
+{
+  return x < 12345U ? -1U : 0;
+}
+
+unsigned int
+f7 (unsigned short *x)
+{
+  return x[0] < 1234U ? -1U : 0;
+}
+
+unsigned int
+f8 (unsigned char *x)
+{
+  return x[0] < 123U ? -1U : 0;
+}