diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2adb44a1371f..3093c09d19b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-02-18 Eric Botcazou + + * calls.c (mem_overlaps_already_clobbered_arg_p): Return true + for arg pointer based indexed addressing. + 2007-02-18 Ira Rosen * tree-ssa-alias.c (may_aliases_intersect): New function. diff --git a/gcc/calls.c b/gcc/calls.c index 49fea91cf82e..063e6847e98b 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1480,10 +1480,14 @@ mem_overlaps_already_clobbered_arg_p (rtx addr, unsigned HOST_WIDE_INT size) if (addr == current_function_internal_arg_pointer) i = 0; else if (GET_CODE (addr) == PLUS - && (XEXP (addr, 0) - == current_function_internal_arg_pointer) + && XEXP (addr, 0) == current_function_internal_arg_pointer && GET_CODE (XEXP (addr, 1)) == CONST_INT) i = INTVAL (XEXP (addr, 1)); + /* Return true for arg pointer based indexed addressing. */ + else if (GET_CODE (addr) == PLUS + && (XEXP (addr, 0) == current_function_internal_arg_pointer + || XEXP (addr, 1) == current_function_internal_arg_pointer)) + return true; else return false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 06b66d98ef2a..d45cfc92acb2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-02-18 Eric Botcazou + + * gnat.dg/tail_call_p.ads, tail_call_p.adb, tail_call.adb: New test. + 2007-02-18 Eric Botcazou * lib/gnat.exp (gnat_target_compile): Pass -f to the driver. diff --git a/gcc/testsuite/gnat.dg/tail_call.adb b/gcc/testsuite/gnat.dg/tail_call.adb new file mode 100644 index 000000000000..4f109adffc58 --- /dev/null +++ b/gcc/testsuite/gnat.dg/tail_call.adb @@ -0,0 +1,9 @@ +-- { dg-do run } +-- { dg-options "-O2 -fno-unit-at-a-time" } + +with Tail_Call_P; use Tail_Call_P; + +procedure Tail_Call is +begin + Insert (My_Array, 0, 0); +end; diff --git a/gcc/testsuite/gnat.dg/tail_call_p.adb b/gcc/testsuite/gnat.dg/tail_call_p.adb new file mode 100644 index 000000000000..56add5f6b757 --- /dev/null +++ b/gcc/testsuite/gnat.dg/tail_call_p.adb @@ -0,0 +1,35 @@ +package body Tail_Call_P is + + function Start_Side (Element : T) return Index is + begin + if Element = 1 then + raise Program_Error; + end if; + if Element = 0 then + return Second; + else + return First; + end if; + end; + + function Segment (Element : T) return T is + begin + if Element /= 0 then + raise Program_Error; + end if; + return 1; + end; + + procedure Really_Insert (Into : T; Element : T; Value : T) is + begin + if Into /= 0 then + raise Program_Error; + end if; + end; + + procedure Insert (Into : A; Element : T; Value : T) is + begin + Really_Insert (Into (Start_Side (Element)), Segment (Element), Value); + end Insert; + +end Tail_Call_P; diff --git a/gcc/testsuite/gnat.dg/tail_call_p.ads b/gcc/testsuite/gnat.dg/tail_call_p.ads new file mode 100644 index 000000000000..1665bc30c559 --- /dev/null +++ b/gcc/testsuite/gnat.dg/tail_call_p.ads @@ -0,0 +1,13 @@ +package Tail_Call_P is + + type T is new Natural; + + type Index is (First, Second); + + type A is array (Index) of T; + + My_Array : A := (0, 0); + + procedure Insert (Into : A; Element : T; Value : T); + +end Tail_Call_P;