https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65510
--- Comment #2 from Chen Gang <gang.chen.5i5j at gmail dot com> --- For test.i: int oxu_driver_init(void) { *(volatile unsigned int *)(-1) = *(unsigned int *)(-1); } If test.i use a valid number (>= 0x10) or normal variable instead of "-1", it will be OK (the insns are almost the same between using valid numbers and using variable). If test.i use 0 (NULL) instead of "-1", it will be OK, too, but it will generate an abort() insn for it (unlike valid numbers' and variable's insn). If test.i se invalid number (e.g. -2, -1, 0x1, 0x2 ... 0xf), it will generate a different insn which can not be recognized by MD file. So for me, we need process the left invalid numbers just as processing 0 (NULL) -- generate an abort() insn for them.