[PATCH, i386]: Fix PR68701: ICE with -ffixed-ebp
Uros Bizjak
ubizjak@gmail.com
Tue Dec 8 18:39:00 GMT 2015
Hello!
Attached patch fixes a compilation corner case, where -ffixed-ebp
option interferes with stack realignment requirements (the realignment
without -maccumulate-outgoing-args needs live %ebp).
The ICE can be worked around by adding -maccumulate-outgoing-args to
compile flags, and this is what the patch does, in addition to
emitting an informative warning.
2015-12-08 Uros Bizjak <ubizjak@gmail.com>
PR target/68701
* config/i386/i386.c (ix86_option_override_internal): Enable
-maccumulate-outgoing-args when %ebp is fixed due to stack
realignment requirements.
testsuite/ChangeLog:
2015-12-08 Uros Bizjak <ubizjak@gmail.com>
PR target/68701
* testsuite/gcc.target/i386/pr68701-1.c: New test.
* testsuite/gcc.target/i386/pr68701-2.c: Ditto.
Patch was bootstrapped and regression tested on x86_64-linux-gnu
{,-m32}. Patch was committed to mainline SVN and will be backported to
all active branches in a couple of days.
Uros.
-------------- next part --------------
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c (revision 231413)
+++ config/i386/i386.c (working copy)
@@ -5296,6 +5296,17 @@ ix86_option_override_internal (bool main_args_p,
opts->x_target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
}
+ /* Stack realignment without -maccumulate-outgoing-args requires %ebp,
+ so enable -maccumulate-outgoing-args when %ebp is fixed. */
+ if (fixed_regs[BP_REG]
+ && !(opts->x_target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
+ {
+ if (opts_set->x_target_flags & MASK_ACCUMULATE_OUTGOING_ARGS)
+ warning (0, "fixed ebp register requires %saccumulate-outgoing-args%s",
+ prefix, suffix);
+ opts->x_target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
+ }
+
/* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix. */
{
char *p;
Index: testsuite/gcc.target/i386/pr68701-1.c
===================================================================
--- testsuite/gcc.target/i386/pr68701-1.c (nonexistent)
+++ testsuite/gcc.target/i386/pr68701-1.c (working copy)
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ffixed-ebp -mno-accumulate-outgoing-args" } */
+
+/* { dg-warning "fixed ebp register requires" "" { target *-*-* } 0 } */
+
+void foo (void);
+
+int
+main (int argc, char *argv[])
+{
+ foo ();
+ return argc - 1;
+}
Index: testsuite/gcc.target/i386/pr68701-2.c
===================================================================
--- testsuite/gcc.target/i386/pr68701-2.c (nonexistent)
+++ testsuite/gcc.target/i386/pr68701-2.c (working copy)
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ffixed-ebp -mno-accumulate-outgoing-args -mstackrealign -msse" } */
+
+/* { dg-warning "fixed ebp register requires" "" { target *-*-* } 0 } */
+
+typedef float V __attribute__((vector_size(16)));
+
+void bar (V a)
+{
+ volatile V b = a;
+}
More information about the Gcc-patches
mailing list