[pr82089] Don't sign-extend SFV 1 in BImode
authorAndrew Stubbs <ams@codesourcery.com>
Thu, 27 Sep 2018 11:15:48 +0000 (11:15 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Thu, 27 Sep 2018 11:15:48 +0000 (11:15 +0000)
This is an update of the patch posted to PR82089 long ago.  We ran into the
same bug on GCN, so we need this fixed as part of this series.

2018-09-27  Andrew Stubbs  <ams@codesourcery.com>
            Tom de Vries  <tom@codesourcery.com>

PR 82089

gcc/
* expmed.c (emit_cstore): Fix handling of result_mode == BImode and
STORE_FLAG_VALUE == 1.

Co-Authored-By: Tom de Vries <tom@codesourcery.com>
From-SVN: r264666

gcc/ChangeLog
gcc/expmed.c

index 8691d52462a43b6ff7750e99cd9694d01489d0c4..4606d9d108b7fc411ea4361ad22fb9f7c5259696 100644 (file)
@@ -1,3 +1,11 @@
+2018-09-27  Andrew Stubbs  <ams@codesourcery.com>
+            Tom de Vries  <tom@codesourcery.com>
+
+       PR 82089
+
+       * expmed.c (emit_cstore): Fix handling of result_mode == BImode and
+       STORE_FLAG_VALUE == 1.
+
 2018-09-27  Andreas Krebbel  <krebbel@linux.ibm.com>
 
        * config/s390/s390.md (PPA_TX_ABORT, PPA_OOO_BARRIER): New
index 29ce10b4de2f1fe7e6fd2a76d62aed231382ae7a..444d6a82f983c316cd287d03f48db4aab02a8cbb 100644 (file)
@@ -5464,11 +5464,14 @@ emit_cstore (rtx target, enum insn_code icode, enum rtx_code code,
      If STORE_FLAG_VALUE does not have the sign bit set when
      interpreted in MODE, we can do this conversion as unsigned, which
      is usually more efficient.  */
-  if (GET_MODE_SIZE (int_target_mode) > GET_MODE_SIZE (result_mode))
+  if (GET_MODE_PRECISION (int_target_mode) > GET_MODE_PRECISION (result_mode))
     {
-      convert_move (target, subtarget,
-                   val_signbit_known_clear_p (result_mode,
-                                              STORE_FLAG_VALUE));
+      gcc_assert (GET_MODE_PRECISION (result_mode) != 1
+                 || STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1);
+
+      bool unsignedp = (STORE_FLAG_VALUE >= 0);
+      convert_move (target, subtarget, unsignedp);
+
       op0 = target;
       result_mode = int_target_mode;
     }