Commit d6c2c77c by Josh Conner Committed by Josh Conner

re PR middle-end/32602 (Sibcall optimization fails to detect overlap)

2007-07-06  Josh Conner  <jconner@apple.com>

	PR middle-end/32602
	PR middle-end/32603
	* calls.c (store_one_arg): Handle arguments which are partially
	on the stack when detecting argument overlap.

2007-07-06  Josh Conner  <jconner@apple.com>

	PR middle-end/32602
	* gcc.dg/sibcall-8.c: New test.

2007-07-06  Josh Conner  <jconner@apple.com>

	PR middle-end/32603
	* gcc.target/arm/sibcall-1.c: New test.

From-SVN: r126422
parent bb9d1da7
2007-07-06 Josh Conner <jconner@apple.com>
PR middle-end/32602
PR middle-end/32603
* calls.c (store_one_arg): Handle arguments which are partially
on the stack when detecting argument overlap.
2007-07-06 Bernd Schmidt <bernd.schmidt@analog.com>
* reload1.c (choose_reload_regs): Set reload_spill_index for regs
......
......@@ -4326,6 +4326,7 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags,
/* expand_call should ensure this. */
gcc_assert (!arg->locate.offset.var
&& arg->locate.size.var == 0
&& GET_CODE (size_rtx) == CONST_INT);
if (arg->locate.offset.constant > i)
......@@ -4335,7 +4336,21 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags,
}
else if (arg->locate.offset.constant < i)
{
if (i < arg->locate.offset.constant + INTVAL (size_rtx))
/* Use arg->locate.size.constant instead of size_rtx
because we only care about the part of the argument
on the stack. */
if (i < (arg->locate.offset.constant
+ arg->locate.size.constant))
sibcall_failure = 1;
}
else
{
/* Even though they appear to be at the same location,
if part of the outgoing argument is in registers,
they aren't really at the same location. Check for
this by making sure that the incoming size is the
same as the outgoing size. */
if (arg->locate.size.constant != INTVAL (size_rtx))
sibcall_failure = 1;
}
}
......
2007-07-06 Josh Conner <jconner@apple.com>
PR middle-end/32602
* gcc.dg/sibcall-8.c: New test.
2007-07-06 Josh Conner <jconner@apple.com>
PR middle-end/32603
* gcc.target/arm/sibcall-1.c: New test.
2007-07-06 H.J. Lu <hongjiu.lu@intel.com>
* gcc.dg/dfp/convert-dfp-round-thread.c: New test.
/* { dg-do run } */
/* { dg-options "-O2 -foptimize-sibling-calls" } */
typedef struct {
int data[4];
} arr16_t;
int result = 0;
void func2(int i, int j, arr16_t arr)
{
result = (arr.data[0] != 1
|| arr.data[1] != 2
|| arr.data[2] != 3
|| arr.data[3] != 4);
}
void func1(int i, int j, int k, arr16_t a)
{
func2(i, j, a);
}
int main(int argc, const char *argv[])
{
arr16_t arr = {{1, 2, 3, 4}};
func1(0, 0, 0, arr);
return result;
}
/* { dg-do compile { target { arm32 } } } */
/* { dg-options "-O2" } */
#define noinline __attribute__((noinline))
typedef struct {
int data[4];
} arr16_t;
int result = 0;
void noinline func2 (int i, int j, arr16_t arr)
{
result = (arr.data[0] != 1
|| arr.data[1] != 2
|| arr.data[2] != 3
|| arr.data[3] != 4);
}
void func1 (int i, int j, int k, int l, int m, int n, arr16_t a)
{
func2(i, j, a);
}
int main(int argc, const char *argv[])
{
arr16_t arr = {{1, 2, 3, 4}};
func1(0, 0, 0, 0, 0, 0, arr);
return result;
}
/* { dg-final { scan-assembler "\tb\tfunc2\n" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment