From 61d1d9a664851d5004d8238c996d0f42768c0562 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 11 Dec 2018 15:50:22 +0100 Subject: [PATCH] re PR target/88425 (suboptimal code for acc_0_m1_neg_leu): New define_insn_and_split. * gcc.target/i386/pr88425.c: New test. From-SVN: r267023 --- gcc/ChangeLog | 6 +++ gcc/config/i386/i386.md | 18 +++++++++ gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/gcc.target/i386/pr88425.c | 53 +++++++++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr88425.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a40b365be28..31cafdca13e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-12-11 Jakub Jelinek + + PR target/88425 + * config/i386/i386.md (*x86_movcc_0_m1_neg_leu): + New define_insn_and_split. + 2018-12-11 Richard Biener PR middle-end/88448 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 37a92f5bb30..800b64917dc 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -17195,6 +17195,24 @@ (set_attr "mode" "") (set_attr "length_immediate" "0")]) +(define_insn_and_split "*x86_movcc_0_m1_neg_leu" + [(set (match_operand:SWI48 0 "register_operand" "=r") + (neg:SWI48 + (leu:SWI48 + (match_operand:SWI 1 "nonimmediate_operand" "m") + (match_operand:SWI 2 "" "")))) + (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 "*movcc_noc" [(set (match_operand:SWI248 0 "register_operand" "=r,r") (if_then_else:SWI248 (match_operator 1 "ix86_comparison_operator" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 52804b4b8b6..12acfe31ad5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2018-12-11 Jakub Jelinek + 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 index 00000000000..e0df5605aee --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr88425.c @@ -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; +} -- 2.30.2