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.

Reply via email to