It looks like this branch is redundent?
+      else if (OP_iadd(lda_op))
+        asm_opnd = OP_opnd( lda_op, 1 );

It's fully covered by the else part.

2012/3/16 Gang Yu <yugang...@gmail.com>:
> Hi,
>
>   could a gatekeeper please help review the fix for bug955? regression
> caused by r3882.
>
> r3882 causes some regressions on compilation for m32 fpic related
> applications. For example, open64 triple build failed. a cut down bug-case
> below:
>
> opencc -m32 -fpic -S bug955.c
>
> typedef long long mask_t;
> typedef struct phase_struct {
> char key;
> mask_t mask;
> } phase_info_t;
>
> int a[]={3,5};
> static phase_info_t phase_info[] = {
>   {'N', 0x0000000000000000LL},
> };
>
>
> typedef enum {
> P_NONE,
> P_All,
> } phases_t;
>
>
> extern mask_t get_phase_mask (phases_t i);
>
> mask_t
> get_phase_mask (phases_t i)
> {
>   a[0]=1;
> return phase_info[i].mask;
> }
>
> opencc -m32 -fpic -S bug955.c, we get
> #  20
> #  21  mask_t
> #  22  get_phase_mask (phases_t i)
> #  23  {
> .LBB2_get_phase_mask:
>         addl $-12,%esp                  # [0]
>         movl %ebp,4(%esp)               # [1] _temp_gra_spill1
>         movl %ebx,0(%esp)               # [1] _temp_lcl_spill0
>         call .LBB3_get_phase_mask       # [1] .LBB3_get_phase_mask
> .LBB3_get_phase_mask:
>         popl %ebx                       # [0]
>         addl $_GLOBAL_OFFSET_TABLE_+[.-.LBB3_get_phase_mask],%ebx       #
> [3]
> .LBB3_get_phase_mask
> .LBB1_get_phase_mask:
>         .loc    1       24      0
> #  24    a[0]=1;
>         movl a@GOT(%ebx),%ebp           # [0] a
>         .loc    1       25      0
> #  25   return phase_info[i].mask;
>         movl 16(%esp),%eax              # [0] i
>         .loc    1       24      0
>         movl $1,%ecx                    # [0]
>         imull $12,%eax                  # [3]
>         .loc    1       25      0
>         movl .data+24(%ebx,%eax,1), %edx        # [6] id:8 phase_info+0x0
>         movl .data+20(%ebx,%eax,1), %eax        # [6] id:8 phase_info+0x0
>         .loc    1       24      0
>         movl %ecx,0(%ebp)               # [7] id:6 a+0x0
>         .loc    1       25      0
>         movl 0(%esp),%ebx               # [7] _temp_lcl_spill0
>         movl 4(%esp),%ebp               # [7] _temp_gra_spill1
>         addl $12,%esp                   # [8]
>         ret                             # [8]
>
>
>    movl .data+24(%ebx,%eax,1), %edx        # [6] id:8 phase_info+0x0
>    movl .data+20(%ebx,%eax,1), %eax        # [6] id:8 phase_info+0x0
> should be
>    movl .data@GOTOFF+24(%ebx,%eax,1), %edx
>    movl .data@GOTOFF+20(%ebx,%eax,1), %eax
>
> although this is an optimization bug occurs at the EBO phase,
> Compose_Addr_offset ignores the symbol(.data+24) reloc attribute, wrongly
> TN_RELOC_NONE symbol generated. However, we don't want to fix in this way.
> Because TN_RELOC_IA32_GOTOFF is not allowed to be linked in a shared obj to
> external undefined symbols, such info below:
>
> /usr/bin/ld: CMakeFiles/akonadiprivate.dir/shared/akapplication.cpp.o:
> relocation R_386_GOTOFF against undefined symbol `vtable for
> boost::program_options::variables_map' can not be used when making a shared
> object
> Instead, we try to avoid the using of TN_RELOC_IA32_GOTOFF in -fpic code, we
> back to use IA32_GOT as r3881 did. Only in those cases have to change to
> IA32_GOTOFF, we do it.
> the patch:
>
>
> osprey/be/cg/x8664/cgtarget.cxx    -- e78cbf9..33ff39a 100644
> --- a/osprey/be/cg/x8664/cgtarget.cxx
> +++ b/osprey/be/cg/x8664/cgtarget.cxx
> @@ -3910,10 +3910,34 @@ TN* CGTARG_Process_Asm_m_constraint( WN* load,
> void** offset, OPS* ops )
>      OP* lda_op = OPS_last( ops );
>      // open64.net bug951. On finding the symbol TN, don't miss the cases
> of:
>      //  TN :- ld32 GTN2(%rbx) (sym:base_sym +0)
> -    //  TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst)
> +    // and
> +    //  TN_tmp :- ld32 GTN2(%rbx) (sym:base_sym +0)
> +    //  TN :- lea32 TN_tmp ofst_TN
> +    // result_sym of the first case is
> +    // (sym:base_sym + 0), reloc: TN_RELOC_IA32_GOT
> +    // result_sym of the latter case is
> +    // (sym:base_sym + base_ofst), reloc: TN_RELOC_IA32_GOTOFF
> +
>      if (Is_Target_32bit() && Gen_PIC_Shared) {
> -      asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) :
> -        (OP_code(lda_op) == TOP_ldc32) ? OP_opnd( lda_op, 0) : OP_opnd(
> lda_op, 1);
> +      OP * prev_lda = OP_prev(lda_op);
> +      if (OP_code(lda_op) == TOP_lea32 &&
> +          prev_lda &&
> +          OP_code(prev_lda) == TOP_ld32 &&
> +          TN_is_constant(OP_opnd(lda_op, 1)) &&
> +          TN_register(OP_opnd(lda_op, 0)) ==
> TN_register(OP_result(prev_lda, 0)) &&
> +          TN_is_symbol(OP_opnd(prev_lda, 1)) &&
> +          TN_relocs(OP_opnd(prev_lda, 1)) == TN_RELOC_IA32_GOT) {
> +        asm_opnd = Gen_Symbol_TN( TN_var(OP_opnd(prev_lda, 1)),
> +                                  TN_value(OP_opnd(lda_op, 1)),
> +                                  TN_RELOC_IA32_GOTOFF );
> +        OPS_Remove_Op (ops, prev_lda);
> +      }
> +      else if (OP_iadd(lda_op))
> +        asm_opnd = OP_opnd( lda_op, 1 );
> +      else if (OP_code(lda_op) == TOP_ldc32)
> +        asm_opnd = OP_opnd( lda_op, 0);
> +      else
> +        asm_opnd = OP_opnd( lda_op, 1 );
>      } else {
>        asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( lda_op,
> 0 );
>      }
> osprey/be/cg/x8664/exp_loadstore.cxx    -- 58cb61e..81158d5 100644
> --- a/osprey/be/cg/x8664/exp_loadstore.cxx
> +++ b/osprey/be/cg/x8664/exp_loadstore.cxx
> @@ -1267,29 +1267,18 @@ Exp_Ldst (
>                                 STB_section(base_sym) /* bug 10097 */)) ){
>           FmtAssert(!ST_is_thread_local(base_sym),
>                     ("Exp_Ldst: thread-local storage NYI under PIC"));
> +          TN* tmp = base_ofst == 0 ? tn : Build_TN_Like(tn);
> +         Build_OP( TOP_ld32, tmp, Ebx_TN(),
> +                   Gen_Symbol_TN( base_sym, 0, TN_RELOC_IA32_GOT ),
> +                   &newops );
> -          // open64.net bug951.
> -          // when base_ofst ! = 0, we generate
> -          // TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst)
> -          // instead of
> -          // tmp_TN :- ld32 GT2(%bx) (sym:base_sym + 0)
> -          // TN :- lea32 tmp_TN base_ofst
> -          // this is for consideration of facilitate restoring the register
> TN
> -          // to symbol TN in ASM m constraint.
> -          // And also this reduces a temp TN.
> -
> -          if (base_ofst == 0)
> -            Build_OP( TOP_ld32, tn, Ebx_TN(),
> -                      Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_IA32_GOT
> ),
> -                      &newops );
> -          else
> -            Build_OP( TOP_lea32, tn, Ebx_TN(),
> -                      Gen_Symbol_TN( base_sym, base_ofst,
> TN_RELOC_IA32_GOTOFF ),
> -                      &newops );
>           // got address should not alias
>           Set_OP_no_alias(OPS_last(&newops));
>           PU_References_GOT = TRUE;
> +         if( base_ofst != 0 ){
> +           Build_OP( TOP_lea32, tn, tmp, Gen_Literal_TN(base_ofst, 4),
> &newops );
> +         }
>         } else {
>           Build_OP( TOP_ldc32, tn,
>                     Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_NONE ),
> TIA for review
>
> Regards
> Gang
>
> ------------------------------------------------------------------------------
> This SF email is sponsosred by:
> Try Windows Azure free for 90 days Click Here
> http://p.sf.net/sfu/sfd2d-msazure
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>



-- 
Regards,
Lai Jian-Xin

------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to