The problem is that x86 is the only target that defines HAVE_ATTR_length and
doesn't schedule any splitting pass at -O0 after pro_and_epilogue.
So, either we go back to handling this during vzeroupper output
(unconditionally, rather than flag_ipa_ra guarded), or we need to tweak the
split* passes for x86.
Seems there are 5 split passes, split1 is run unconditionally before reload,
split2 is run for optimize > 0 or STACK_REGS (x86) after ra but before
epilogue_completed, split3 is run before regstack for STACK_REGS and
optimize and -fno-schedule-insns2, split4 is run before sched2 if sched2 is
run and split5 is run before shorten_branches if HAVE_ATTR_length and not
STACK_REGS.
2020-02-05 Jakub Jelinek <jakub@redhat.com>
PR target/92190
* recog.c (pass_split_after_reload::gate): For STACK_REGS targets,
don't run when !optimize.
(pass_split_before_regstack::gate): For STACK_REGS targets, run even
when !optimize.
+2020-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/92190
+ * recog.c (pass_split_after_reload::gate): For STACK_REGS targets,
+ don't run when !optimize.
+ (pass_split_before_regstack::gate): For STACK_REGS targets, run even
+ when !optimize.
+
2020-02-05 Richard Biener <rguenther@suse.de>
PR middle-end/90648
virtual bool gate (function *)
{
/* If optimizing, then go ahead and split insns now. */
- if (optimize > 0)
- return true;
-
-#ifdef STACK_REGS
- return true;
-#else
- return false;
-#endif
+ return optimize > 0;
}
virtual unsigned int execute (function *)
split until final which doesn't allow splitting
if HAVE_ATTR_length. */
# ifdef INSN_SCHEDULING
- return (optimize && !flag_schedule_insns_after_reload);
+ return !optimize || !flag_schedule_insns_after_reload;
# else
- return (optimize);
+ return true;
# endif
#else
- return 0;
+ return false;
#endif
}