https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97417
--- Comment #4 from jiawei <jiawei at iscas dot ac.cn> --- I had did some tests with this problem and find: foo.c #include <stdbool.h> extern volatile bool active; int foo(void) { if (!active) { return 42; } else { return -42; } } code generated in foo.s foo: lui a5,%hi(active) lbu a5,%lo(active)(a5) li a0,42 andi a5,a5,0xff beq a5,zero,.L2 li a0,-42 When we remove the keyword `volatile` foo_without_volatile.c #include <stdbool.h> extern bool active; int foo(void) { if (!active) { return 42; } else { return -42; } } code generated in foo_without_volatile.s foo: lui a5,%hi(active) lbu a5,%lo(active)(a5) li a0,42 beq a5,zero,.L2 li a0,-42 and then we change the type from `bool` to `int` foo_int.c #include <stdbool.h> extern volatile int active; int foo(void) { if (!active) { return 42; } else { return -42; } } code generated in foo_int.s foo: lui a5,%hi(active) lw a5,%lo(active)(a5) li a0,42 sext.w a5,a5 beq a5,zero,.L2 li a0,-42 the `sext.w` instruction replace the `andi` We also remove the keyword `volatile` in foo_int_without_volatile.c #include <stdbool.h> extern int active; int foo(void) { if (!active) { return 42; } else { return -42; } } code generated in foo_int_without_volatile.s also look like optimized foo: lui a5,%hi(active) lw a5,%lo(active)(a5) li a0,42 beq a5,zero,.L2 li a0,-42 Maybe this problem is due to the keyword `volatile`.