re PR rtl-optimization/63718 (ARM Thumb1 bootstrap fail after fuse-caller-save info...
authorTom de Vries <tom@codesourcery.com>
Tue, 2 Dec 2014 13:35:10 +0000 (13:35 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Tue, 2 Dec 2014 13:35:10 +0000 (13:35 +0000)
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.

From-SVN: r218271

gcc/ChangeLog
gcc/config/arm/arm.c

index 2bf3bce9b7b916b93fc1704947b0882f27eabe95..3eacc5a258837833a45a89770b8402a3c04b95c2 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 c40c3bd709a297b6199e4d25409fb01b264d42c2..f3be6cfc7f4092098734f228169c51704ea94103 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 ();
 }