This issue also remains in 4.9 and 5.0 branches. Is this OK to backport to the release branches.
Thanks, Kugan On 02/12/15 10:00, Kugan wrote: > >>> >>> gcc/ChangeLog: >>> >>> 2015-11-18 Kugan Vivekanandarajah <kug...@linaro.org> >>> >>> PR target/68390 >>> * config/arm/arm.c (arm_function_ok_for_sibcall): Get function type >>> for indirect function call. >>> >>> gcc/testsuite/ChangeLog: >>> >>> 2015-11-18 Kugan Vivekanandarajah <kug...@linaro.org> >>> >>> PR target/68390 >>> * gcc.target/arm/PR68390.c: New test. >>> >> >> s/PR/pr in the test name and put this in gcc.c-torture/execute instead - >> there is nothing ARM specific about the test. Tests in gcc.target/arm should >> really only be architecture specific. This isn't. >> >>> >>> >>> >>> p.txt >>> >>> >>> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c >>> index a379121..0dae7da 100644 >>> --- a/gcc/config/arm/arm.c >>> +++ b/gcc/config/arm/arm.c >>> @@ -6680,8 +6680,13 @@ arm_function_ok_for_sibcall (tree decl, tree exp) >>> a VFP register but then need to transfer it to a core >>> register. */ >>> rtx a, b; >>> + tree fn_decl = decl; >> >> Call it decl_or_type instead - it's really that ... >> >>> >>> - a = arm_function_value (TREE_TYPE (exp), decl, false); >>> + /* If it is an indirect function pointer, get the function type. */ >>> + if (!decl) >>> + fn_decl = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp))); >>> + >> >> This is probably just my mail client - but please watch out for indentation. >> >>> + a = arm_function_value (TREE_TYPE (exp), fn_decl, false); >>> b = arm_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)), >>> cfun->decl, false); >>> if (!rtx_equal_p (a, b)) >> >> >> OK with those changes. >> >> Ramana >> >