diff mbox

[PR,rtl-optimization/pr52773] Do not reference virtual_outgoing_args after vreg instantiation

Message ID 54BA11BF.3050609@redhat.com
State New
Headers show

Commit Message

Jeff Law Jan. 17, 2015, 7:39 a.m. UTC
As discussed in the PR and associated patch from Bernd

https://gcc.gnu.org/ml/gcc-patches/2013-06/msg01147.html

There are cases where we can call into emit_library_call_value after 
virtual register instantiation is complete.  That can result in a 
reference to a virtual register surviving until LRA/reload which causes 
an ICE.

Bernd's patch changes the code to use a stack pointer reference instead. 
  Note this is just for use in CALL_INSN_FUNCTION_USAGE.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu.  I'll 
fire up another m68k bootstrap since that will likely exercise this more 
given it pushes arguments.

Installed on the trunk on Bernd's behalf.

Jeff
commit d059ba35689a92b87a2f20408f6c2daafc3a39e1
Author: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Sat Jan 17 07:35:40 2015 +0000

    	PR rtl-optimization/52773
    	* calls.c (emit_library_call_value): When pushing arguments use
    	stack_pointer_rtx rather than virtual_outgoing_args_rtx in
    	CALL_INSN_FUNCTION_USAGE.  Only emit one of use of the magic
    	stack pointer reference into CALL_INSN_FUNCTION_USAGE.
    
    	PR rtl-optimization/52773
    	* gcc.c-torture/compile/pr52773.c: New test.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219796 138bc75d-0d04-0410-961f-82ee72b054a4
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 04ae255..80f8c92 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@ 
+2015-01-17  Bernd Schmidt  <bernds@codesourcery.com>
+
+	PR rtl-optimization/52773
+	* calls.c (emit_library_call_value): When pushing arguments use
+	stack_pointer_rtx rather than virtual_outgoing_args_rtx in
+	CALL_INSN_FUNCTION_USAGE.  Only emit one of use of the magic
+	stack pointer reference into CALL_INSN_FUNCTION_USAGE.
+
 2015-01-17  Jeff Law  <law@redhat.com>
 
 	PR rtl-optimization/32790
diff --git a/gcc/calls.c b/gcc/calls.c
index 1c2f0ad..ec44624 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -3808,6 +3808,7 @@  emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
   int reg_parm_stack_space = 0;
   int needed;
   rtx_insn *before_call;
+  bool have_push_fusage;
   tree tfom;			/* type_for_mode (outmode, 0) */
 
 #ifdef REG_PARM_STACK_SPACE
@@ -4165,6 +4166,8 @@  emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
 
   /* Push the args that need to be pushed.  */
 
+  have_push_fusage = false;
+
   /* ARGNUM indexes the ARGVEC array in the order in which the arguments
      are to be pushed.  */
   for (count = 0; count < nargs; count++, argnum--)
@@ -4256,14 +4259,19 @@  emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
 	  if (argblock)
 	    use = plus_constant (Pmode, argblock,
 				 argvec[argnum].locate.offset.constant);
+	  else if (have_push_fusage)
+	    continue;
 	  else
-	    /* When arguments are pushed, trying to tell alias.c where
-	       exactly this argument is won't work, because the
-	       auto-increment causes confusion.  So we merely indicate
-	       that we access something with a known mode somewhere on
-	       the stack.  */
-	    use = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
-				gen_rtx_SCRATCH (Pmode));
+	    {
+	      /* When arguments are pushed, trying to tell alias.c where
+		 exactly this argument is won't work, because the
+		 auto-increment causes confusion.  So we merely indicate
+		 that we access something with a known mode somewhere on
+		 the stack.  */
+	      use = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
+				  gen_rtx_SCRATCH (Pmode));
+	      have_push_fusage = true;
+	    }
 	  use = gen_rtx_MEM (argvec[argnum].mode, use);
 	  use = gen_rtx_USE (VOIDmode, use);
 	  call_fusage = gen_rtx_EXPR_LIST (VOIDmode, use, call_fusage);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 41ad87e..3d424ce 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@ 
+2015-01-16  Bernd Schmidt  <bernds@codesourcery.com>
+
+	PR rtl-optimization/52773
+	* gcc.c-torture/compile/pr52773.c: New test.
+
 2015-01-16  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/62134
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr52773.c b/gcc/testsuite/gcc.c-torture/compile/pr52773.c
new file mode 100644
index 0000000..8daa5ee
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr52773.c
@@ -0,0 +1,16 @@ 
+/* pr52773.c */
+
+struct s {
+    short x;
+    short _pad[2];
+};
+
+static short mat_a_x;
+
+void transform(const struct s *src, struct s *dst, int n)
+{
+    int i;
+
+    for (i = 0; i < n; ++i)
+	dst[i].x = (src[i].x * mat_a_x) >> 6;
+}