https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116043
Hongtao Liu <liuhongt at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |liuhongt at gcc dot gnu.org --- Comment #11 from Hongtao Liu <liuhongt at gcc dot gnu.org> --- The buggy insn is like ---------------- (insn:TI 348 525 527 5 (set (reg:DI 4 si [156]) (const:DI (unspec:DI [ (symbol_ref:DI ("__libc_tsd_CTYPE_B") [flags 0x60] <var_decl 0x7b3f66210c60 __libc_tsd_CTYPE_B>) ] UNSPEC_GOTNTPOFF))) "/app/example.c":12:37 discrim 1 258 {*leadi} (nil)) ----------------- -----------------define_insn is like------------------ 6276(define_insn "*lea<mode>" 6277 [(set (match_operand:SWI48 0 "register_operand" "=r") 6278 (match_operand:SWI48 1 "address_no_seg_operand" "Ts"))] 6279 "ix86_hardreg_mov_ok (operands[0], operands[1])" 1346;; Return true if op is a valid address for LEA, and does not contain 1347;; a segment override. Defined as a special predicate to allow 1348;; mode-less const_int operands pass to address_operand. 1349(define_special_predicate "address_no_seg_operand" 1350 (match_test "address_operand (op, VOIDmode)") 1351{ 1352 struct ix86_address parts; 1353 int ok; 1354 1355 if (!CONST_INT_P (op) 1356 && mode != VOIDmode 1357 && GET_MODE (op) != mode) 1358 return false; 1359 1360 ok = ix86_decompose_address (op, &parts); 1361 gcc_assert (ok); 1362 return parts.seg == ADDR_SPACE_GENERIC; 1363}) ----------------------define_insn ends---------------- I think we can exclude case when base and index are both NULL_RTX, let's always use *mov{si,di}_internal pattern to move const to register.