http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46309
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org Component|c++ |tree-optimization --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-09-24 08:36:27 UTC --- With s/bool/int/ we generate identical code for both, without jumps. Anyway, more important is that we don't seem to optimize the x == CST1 || x == CST2 where __builtin_popcount (CST1 ^ CST2) == 1 in fold-const.c and don't even optimize range tests if the constants alternate and, more importantly, don't seem to do anything similar to fold_range_test at the GIMPLE level. int f1 (int a, int b) { int v1 = (a == 3); int v2 = (a == 1); int v3 = (a == 4); int v4 = (a == 2); return v1 || v2 || v3 || v4; } int f2 (int a, int b) { int v1 = (a == 1); int v2 = (a == 2); int v3 = (a == 3); int v4 = (a == 4); return v1 || v2 || v3 || v4; } int f3 (int a, int b) { int v1 = (a == 3); int v2 = (a == 1); return v1 || v2; } int f4 (int a, int b) { int v1 = (a == 1); int v2 = (a == 2); return v1 || v2; } int f5 (int a, int b) { return a == 3 || a == 1 || a == 4 || a == 2; } int f6 (int a, int b) { return a == 1 || a == 2 || a == 3 || a == 4; } int f7 (int a, int b) { return a == 3 || a == 1; } int f8 (int a, int b) { return a == 1 || a == 2; } int f9 (int a, int b) { return a == 3 || a == 1 || a == 2 || a == 4; }