Take: int f(int a, int *b) { if (a >= 2) *b = 1; else *b = 0; return *b; } int f1(int a, int *b) { int t; if (a >= 2) t = 1; else t = 0; *b = t; return *b; } ---- CUT ---- Both of these are the same. f1 will produce better code.
Shows up in gobmk in spec 2006: else if (distance[pos] == -1) under_control[pos] = 0; else under_control[pos] = 1;
cond_if_else_store_replacement should do this, thus cselim. But you need -O3 as otherwise --param max-stores-to-sink is zero: /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion is disabled. */ if (!opts->x_flag_tree_vectorize || !opts->x_flag_tree_loop_if_convert) maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0, opts->x_param_values, opts_set->x_param_values);