]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[calls.c] PR rtl-optimization/67226: Take into account pretend_args_size when checkin...
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Thu, 26 Nov 2015 11:40:16 +0000 (11:40 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Thu, 26 Nov 2015 11:40:16 +0000 (11:40 +0000)
Backport from mainline
2015-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
            Bernd Schmidt  <bschmidt@redhat.com>

PR rtl-optimization/67226
* calls.c (store_one_arg): Take into account
crtl->args.pretend_args_size when checking for overlap between
arg->value and argblock + arg->locate.offset during sibcall
optimization.

* gcc.c-torture/execute/pr67226.c: New test.

From-SVN: r230937

gcc/ChangeLog
gcc/calls.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr67226.c [new file with mode: 0644]

index f6cab87bb7de73139638491b9450dfd361d55b30..89bef0528605d60f228d351a8a1605148d707394 100644 (file)
@@ -1,3 +1,15 @@
+2015-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       Backport from mainline
+       2015-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+                   Bernd Schmidt  <bschmidt@redhat.com>
+
+       PR rtl-optimization/67226
+       * calls.c (store_one_arg): Take into account
+       crtl->args.pretend_args_size when checking for overlap between
+       arg->value and argblock + arg->locate.offset during sibcall
+       optimization.
+
 2015-11-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        Backport from mainline
index f0c92ddc0182d3216a90e0dc06e9b3a40bca9a45..25f4f101402f576daa8acbc3044a6ecd3b27039d 100644 (file)
@@ -4662,6 +4662,13 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags,
              if (XEXP (x, 0) != crtl->args.internal_arg_pointer)
                i = INTVAL (XEXP (XEXP (x, 0), 1));
 
+             /* arg.locate doesn't contain the pretend_args_size offset,
+                it's part of argblock.  Ensure we don't count it in I.  */
+#ifdef STACK_GROWS_DOWNWARD
+               i -= crtl->args.pretend_args_size;
+#else
+               i += crtl->args.pretend_args_size;
+#endif
              /* expand_call should ensure this.  */
              gcc_assert (!arg->locate.offset.var
                          && arg->locate.size.var == 0
index c2ba540f25dde893c9512ec9df845ddb210a4b4b..1b8f0d48328c033f6aa476b2d2c6714dcef25a87 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       Backport from mainline
+       2015-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR rtl-optimization/67226
+       * gcc.c-torture/execute/pr67226.c: New test.
+
 2015-11-25  Paul Thomas  <pault@gcc.gnu.org>
 
        Backport from trunk.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr67226.c b/gcc/testsuite/gcc.c-torture/execute/pr67226.c
new file mode 100644 (file)
index 0000000..c533496
--- /dev/null
@@ -0,0 +1,42 @@
+struct assembly_operand
+{
+  int type, value, symtype, symflags, marker;
+};
+
+struct assembly_operand to_input, from_input;
+
+void __attribute__ ((__noinline__, __noclone__))
+assemblez_1 (int internal_number, struct assembly_operand o1)
+{
+  if (o1.type != from_input.type)
+    __builtin_abort ();
+}
+
+void __attribute__ ((__noinline__, __noclone__))
+t0 (struct assembly_operand to, struct assembly_operand from)
+{
+  if (to.value == 0)
+    assemblez_1 (32, from);
+  else
+    __builtin_abort ();
+}
+
+int
+main (void)
+{
+  to_input.value = 0;
+  to_input.type = 1;
+  to_input.symtype = 2;
+  to_input.symflags = 3;
+  to_input.marker = 4;
+
+  from_input.value = 5;
+  from_input.type = 6;
+  from_input.symtype = 7;
+  from_input.symflags = 8;
+  from_input.marker = 9;
+
+  t0 (to_input, from_input);
+
+  return 0;
+}