public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Marc Glisse <marc.glisse@inria.fr>
To: gcc-patches@gcc.gnu.org
Subject: Relax VIEW_CONVERT_EXPR - CONVERT_EXPR combination
Date: Sun, 21 May 2017 21:56:00 -0000	[thread overview]
Message-ID: <alpine.DEB.2.02.1705212313230.2140@stedding.saclay.inria.fr> (raw)

[-- Attachment #1: Type: TEXT/PLAIN, Size: 553 bytes --]

Hello,

SRA uses char when scalarizing bool, and we end up with

   _6 = u_1(D) == 0.0;
   _7 = (unsigned char) _6;
   _3 = VIEW_CONVERT_EXPR<_Bool>(_7);

which we currently do not simplify. I am not completely sure what happens 
with types whose precision does not cover their size, I hope this is safe.

Bootstrap+testsuite on powerpc64le-unknown-linux-gnu.

2017-05-22  Marc Glisse  <marc.glisse@inria.fr>

gcc/
 	* match.pd (view_convert (convert@0 @1)): Handle zero-extension.

gcc/testsuite/
 	* gcc.dg/tree-ssa/vce-1.c: New file.

-- 
Marc Glisse

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: TEXT/x-diff; name=vce.patch, Size: 2201 bytes --]

Index: match.pd
===================================================================
--- match.pd	(revision 248312)
+++ match.pd	(working copy)
@@ -1798,27 +1798,30 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 
 /* For integral conversions with the same precision or pointer
    conversions use a NOP_EXPR instead.  */
 (simplify
   (view_convert @0)
   (if ((INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
        && (INTEGRAL_TYPE_P (TREE_TYPE (@0)) || POINTER_TYPE_P (TREE_TYPE (@0)))
        && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (@0)))
    (convert @0)))
 
-/* Strip inner integral conversions that do not change precision or size.  */
+/* Strip inner integral conversions that do not change precision or size, or
+   zero-extend while keeping the same size (for bool-to-char).  */
 (simplify
   (view_convert (convert@0 @1))
   (if ((INTEGRAL_TYPE_P (TREE_TYPE (@0)) || POINTER_TYPE_P (TREE_TYPE (@0)))
        && (INTEGRAL_TYPE_P (TREE_TYPE (@1)) || POINTER_TYPE_P (TREE_TYPE (@1)))
-       && (TYPE_PRECISION (TREE_TYPE (@0)) == TYPE_PRECISION (TREE_TYPE (@1)))
-       && (TYPE_SIZE (TREE_TYPE (@0)) == TYPE_SIZE (TREE_TYPE (@1))))
+       && TYPE_SIZE (TREE_TYPE (@0)) == TYPE_SIZE (TREE_TYPE (@1))
+       && (TYPE_PRECISION (TREE_TYPE (@0)) == TYPE_PRECISION (TREE_TYPE (@1))
+	   || (TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (TREE_TYPE (@1))
+	       && TYPE_UNSIGNED (TREE_TYPE (@1)))))
    (view_convert @1)))
 
 /* Re-association barriers around constants and other re-association
    barriers can be removed.  */
 (simplify
  (paren CONSTANT_CLASS_P@0)
  @0)
 (simplify
  (paren (paren@1 @0))
  @1)
Index: testsuite/gcc.dg/tree-ssa/vce-1.c
===================================================================
--- testsuite/gcc.dg/tree-ssa/vce-1.c	(nonexistent)
+++ testsuite/gcc.dg/tree-ssa/vce-1.c	(working copy)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+typedef struct { _Bool b; } A;
+_Bool f(double u){
+  A a;
+  if(u==0)
+    a.b=1;
+  else
+    a.b=0;
+  return a.b;
+}
+
+/* { dg-final { scan-tree-dump-not "VIEW_CONVERT_EXPR" "optimized" } } */

             reply	other threads:[~2017-05-21 21:22 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-21 21:56 Marc Glisse [this message]
2017-05-24 10:17 ` Richard Biener

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.2.02.1705212313230.2140@stedding.saclay.inria.fr \
    --to=marc.glisse@inria.fr \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).