diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b52e581d60af7492d7e287e4724b09670bd93d38..8fe8a26f394b05e3c464f2c96f87c25cf804367f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-05-26 Wilco Dijkstra <wdijkstr@arm.com> + + * config/aarch64/aarch64.c (aarch64_case_values_threshold): + Return a better case_values_threshold when optimizing. + 2016-05-26 Wilco Dijkstra <wdijkstr@arm.com> * config/aarch64/aarch64-simd.md (aarch64_combinez): diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index bd45a7d0620dec73a451bd87fe67909953d11627..84dcb0be8698cc59616df8c879bf6468d8883a96 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -3572,7 +3572,12 @@ aarch64_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x) return aarch64_tls_referenced_p (x); } -/* Implement TARGET_CASE_VALUES_THRESHOLD. */ +/* Implement TARGET_CASE_VALUES_THRESHOLD. + The expansion for a table switch is quite expensive due to the number + of instructions, the table lookup and hard to predict indirect jump. + When optimizing for speed, and -O3 enabled, use the per-core tuning if + set, otherwise use tables for > 16 cases as a tradeoff between size and + performance. When optimizing for size, use the default setting. */ static unsigned int aarch64_case_values_threshold (void) @@ -3583,7 +3588,7 @@ aarch64_case_values_threshold (void) && selected_cpu->tune->max_case_values != 0) return selected_cpu->tune->max_case_values; else - return default_case_values_threshold (); + return optimize_size ? default_case_values_threshold () : 17; } /* Return true if register REGNO is a valid index register.