re PR middle-end/86511 (Traps are generated for non-trapping compares)
authorUros Bizjak <uros@gcc.gnu.org>
Mon, 16 Jul 2018 15:11:57 +0000 (17:11 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 16 Jul 2018 15:11:57 +0000 (17:11 +0200)
PR target/86511
* expmed.c (emit_store_flag): Do not emit setcc followed by a
conditional move when trapping comparison was split to a
non-trapping one (and vice versa).

From-SVN: r262736

gcc/ChangeLog
gcc/expmed.c

index 56e1ec3..b4a8151 100644 (file)
@@ -1,3 +1,10 @@
+2018-07-16  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/86511
+       * expmed.c (emit_store_flag): Do not emit setcc followed by a
+       conditional move when trapping comparison was split to a
+       non-trapping one (and vice versa).
+
 2018-07-16  Ilya Leoshkevich  <iii@linux.ibm.com>
 
        * config/s390/s390.c (s390_function_profiler): Generate nops
        when result_eq is false.
        (expand_builtin_strcmp): Inline the calls first.
        (expand_builtin_strncmp): Likewise.
-       (inline_string_cmp): New routine. Expand a string compare 
+       (inline_string_cmp): New routine. Expand a string compare
        call by using a sequence of char comparison.
        (inline_expand_builtin_string_cmp): New routine. Inline expansion
        a call to str(n)cmp/memcmp.
-       * doc/invoke.texi (--param builtin-string-cmp-inline-length): New option.
+       * doc/invoke.texi (--param builtin-string-cmp-inline-length):
+       New option.
        * params.def (BUILTIN_STRING_CMP_INLINE_LENGTH): New.
 
 2018-07-13  Richard Earnshaw  <rearnsha@arm.com>
 
        * config.gcc (riscv*-*-*): When setting xlen, handle riscv-*.
 
-2018-07-05  Indu Bhagat  <indu.bhagat@oracle.com> 
+2018-07-05  Indu Bhagat  <indu.bhagat@oracle.com>
 
-       * config/aarch64/aarch64-simd.md: correct flags text for 
+       * config/aarch64/aarch64-simd.md: correct flags text for
        MIN_EXPR replacement.
 
 2018-07-05  James Clarke  <jrtc27@jrtc27.com>
index b01e194..f114eb4 100644 (file)
@@ -6038,6 +6038,11 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
       if (!HAVE_conditional_move)
        return 0;
 
+      /* Do not turn a trapping comparison into a non-trapping one.  */
+      if ((code != EQ && code != NE && code != UNEQ && code != LTGT)
+         && flag_trapping_math)
+       return 0;
+
       /* Try using a setcc instruction for ORDERED/UNORDERED, followed by a
         conditional move.  */
       tem = emit_store_flag_1 (subtarget, first_code, op0, op1, mode, 0,