public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix PR70370
@ 2016-03-24 12:11 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2016-03-24 12:11 UTC (permalink / raw)
  To: gcc-patches


The following patch fixes a missed gimplification of components
of registers used as asm outputs with non-memory constraints.

The solution is to handle !allows_mem during gimplification rather
than leaving it up to RTL expansion.  I'm only handling the case
where we'd otherwise ICE because of invalid GIMPLE, not all
!allows_mem cases we could handle to simplify things at this stage
(in particular not the COMPONENT_REF case in the testcase or the
whole-aggregate case there).

This is a wrong-code bug when checking is disabled as the asm
misses virtual operands in that case.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2016-03-24  Richard Biener  <rguenther@suse.de>

	PR middle-end/70370
	* gimplify.c (gimplify_asm_expr): Handle !allows_mem outputs
	with register bases.

	* gcc.dg/torture/pr70370.c: New testcase.

Index: gcc/gimplify.c
===================================================================
*** gcc/gimplify.c	(revision 234415)
--- gcc/gimplify.c	(working copy)
*************** gimplify_asm_expr (tree *expr_p, gimple_
*** 5191,5196 ****
--- 5205,5236 ----
  	  ret = tret;
  	}
  
+       /* If the constraint does not allow memory make sure we gimplify
+          it to a register if it is not already but its base is.  This
+ 	 happens for complex and vector components.  */
+       if (!allows_mem)
+ 	{
+ 	  tree op = TREE_VALUE (link);
+ 	  if (! is_gimple_val (op)
+ 	      && is_gimple_reg_type (TREE_TYPE (op))
+ 	      && is_gimple_reg (get_base_address (op)))
+ 	    {
+ 	      tree tem = create_tmp_reg (TREE_TYPE (op));
+ 	      tree ass;
+ 	      if (is_inout)
+ 		{
+ 		  ass = build2 (MODIFY_EXPR, TREE_TYPE (tem),
+ 				tem, unshare_expr (op));
+ 		  gimplify_and_add (ass, pre_p);
+ 		}
+ 	      ass = build2 (MODIFY_EXPR, TREE_TYPE (tem), op, tem);
+ 	      gimplify_and_add (ass, post_p);
+ 
+ 	      TREE_VALUE (link) = tem;
+ 	      tret = GS_OK;
+ 	    }
+ 	}
+ 
        vec_safe_push (outputs, link);
        TREE_CHAIN (link) = NULL_TREE;
  
Index: gcc/testsuite/gcc.dg/torture/pr70370.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr70370.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/pr70370.c	(working copy)
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do compile } */
+ 
+ _Complex float
+ test1 (_Complex float f)
+ {
+   __asm__ ("" : "+r" (__real f));
+   return f;
+ }
+ 
+ _Complex float
+ test2 (_Complex float f)
+ {
+   __asm__ ("" : "=r" (__real f));
+   return f;
+ }
+ 
+ struct X { int i; };
+ 
+ struct X 
+ test3 (struct X x)
+ {
+   __asm__ ("" : "=r" (x.i));
+   return x;
+ }
+ 
+ struct X
+ test4 (struct X x)
+ {
+   __asm__ ("" : "+r" (x.i));
+   return x;
+ }
+ 
+ struct X 
+ test5 (struct X x)
+ {
+   __asm__ ("" : "=r" (x));
+   return x;
+ }
+ 
+ struct X
+ test6 (struct X x)
+ {
+   __asm__ ("" : "+r" (x));
+   return x;
+ }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2016-03-24 12:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-24 12:11 [PATCH] Fix PR70370 Richard Biener

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).