2014-12-02 Tom de Vries <tom@codesourcery.com>
authorvries <vries@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Dec 2014 13:35:10 +0000 (13:35 +0000)
committervries <vries@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Dec 2014 13:35:10 +0000 (13:35 +0000)
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
gcc/config/arm/arm.c

index 2bf3bce..3eacc5a 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-02  Tom de Vries  <tom@codesourcery.com>
+
+       PR rtl-optimization/63718
+       * config/arm/arm.c (arm_option_override): Disable fuse-caller-save for
+       Thumb1.
+
 2014-12-02  Richard Biener  <rguenther@suse.de>
 
        * match.pd: When combining divisions exclude the degenerate
index c40c3bd..f3be6cf 100644 (file)
@@ -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 ();
 }