https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88280
--- Comment #2 from denis.campredon at gmail dot com --- I don't know if I should create a separate bug report or not, since it looks kind of related. I've tried to replace the operator of the function e with other and it generates a branch with the following operators -------------------------- int b_and(int i, int a) { return i && i & a; } int b_or(int i, int a) { return i && i | a; } int add(int i, int a) { return i && i + a; } int mult(int i, int a) { return i && i * a; } int left(int i, int a) { return i && i << a; } int right(int i, int a) { return i && i >> a; } int l_or(int i, int a) { return i && (i || a); } -------------------------- But does not with : -------------------------- int b_xor(int i, int a) { return i && i ^ a; } int sub(int i, int a) { return i && i - a; }