From ae705790d7d094bc0d53af7c48359b186b4cac6d Mon Sep 17 00:00:00 2001 From: vries Date: Tue, 2 Dec 2014 13:35:10 +0000 Subject: [PATCH] 2014-12-02 Tom de Vries PR rtl-optimization/63718 * config/arm/arm.c (arm_option_override): Disable fuse-caller-save for Thumb1. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218271 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/arm/arm.c | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2bf3bce..3eacc5a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-12-02 Tom de Vries + + PR rtl-optimization/63718 + * config/arm/arm.c (arm_option_override): Disable fuse-caller-save for + Thumb1. + 2014-12-02 Richard Biener * match.pd: When combining divisions exclude the degenerate diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index c40c3bd..f3be6cf 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -3105,6 +3105,18 @@ arm_option_override (void) && (!arm_arch7 || !current_tune->prefer_ldrd_strd)) flag_schedule_fusion = 0; + /* In Thumb1 mode, we emit the epilogue in RTL, but the last insn + - epilogue_insns - does not accurately model the corresponding insns + emitted in the asm file. In particular, see the comment in thumb_exit + 'Find out how many of the (return) argument registers we can corrupt'. + As a consequence, the epilogue may clobber registers without + fuse-caller-save finding out about it. Therefore, disable fuse-caller-save + in Thumb1 mode. + TODO: Accurately model clobbers for epilogue_insns and reenable + fuse-caller-save. */ + if (TARGET_THUMB1) + flag_use_caller_save = 0; + /* Register global variables with the garbage collector. */ arm_add_gc_roots (); } -- 2.7.4