https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64810
--- Comment #15 from David Malcolm <dmalcolm at gcc dot gnu.org> --- (In reply to David Malcolm from comment #13) > Am investigating. What appears to be happening is the 1st time through arm_option_override, arm_selected_cpu is NULL, but is set to non-NULL at: arm_selected_cpu = arm_selected_arch; The 2nd time through, arm_selected_cpu hasn't been reset, and so the condition: if (arm_selected_arch) { if (arm_selected_cpu) { /* Check for conflict between mcpu and march. */ fires, and this clause fires: /* -mcpu wins. */ arm_selected_arch = NULL; so we have a NULL arm_selected_arch and a non-NULL arm_selected_cpu. Fix appears to be to simply set each of these to NULL at the top of arm_option_override, to prevent state from previous in-process runs from affecting things: --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -2627,6 +2627,10 @@ arm_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, static void arm_option_override (void) { + arm_selected_arch = NULL; + arm_selected_cpu = NULL; + arm_selected_tune = NULL; + if (global_options_set.x_arm_arch_option) arm_selected_arch = &all_architectures[arm_arch_option]; With this, and the previous patch, most of the jit testsuite passes. I still see another failure in: FAIL: test-expressions.c.exe killed: 12479 exp8 0 0 CHILDKILLED SIGSEGV {segmentation violation} which appears to be (yet) another issue.