[PATCH][PR rtl-optimization/pr52773] Do not reference virtual_outgoing_args after vreg instantiation
Jeff Law
law@redhat.com
Sat Jan 17 08:49:00 GMT 2015
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
-------------- next part --------------
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 --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;
+}
More information about the Gcc-patches
mailing list