This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Restrict qualifier still not working?


On Tue, Aug 3, 2010 at 6:38 PM, Bingfeng Mei <bmei@broadcom.com> wrote:
>
>
>> -----Original Message-----
>> From: Richard Guenther [mailto:richard.guenther@gmail.com]
>> Sent: 03 August 2010 17:22
>> To: Bingfeng Mei
>> Cc: Alexander Monakov; gcc@gcc.gnu.org
>> Subject: Re: Restrict qualifier still not working?
>>
>> On Tue, Aug 3, 2010 at 6:11 PM, Bingfeng Mei <bmei@broadcom.com> wrote:
>> > Richard,
>> > I applied the patch. The simple example in my previous mail is
>> > compiled as expected. However, for a bit more complex example,
>> > restrict qualifier still doesn't work as expected. This happens
>> > even on trunk compiler so it is not due to some missing patches on
>> 4.5.
>> >
>> > void foo (int * restrict a, int * restrict b, int * restrict c)
>> > {
>> > ? int i;
>> > ? for(i = 0; i < 100; i+=4)
>> > ? ? {
>> > ? ? ? a[i] = b[i] * c[i];
>> > ? ? ? a[i+1] = b[i+1] * c[i+1];
>> > ? ? ? a[i+2] = b[i+2] * c[i+2];
>> > ? ? ? a[i+3] = b[i+3] * c[i+3];
>> > ? ? }
>> > }
>> >
>> > ~/work/install-x86/bin/gcc tst3.c -O2 -S -std=c99 -da -fschedule-
>> insns -frename-register
>> >
>> > .L2:
>> > ? ? ? ?movl ? ?(%rdx,%rax), %r10d
>> > ? ? ? ?imull ? (%rsi,%rax), %r10d
>> > ? ? ? ?movl ? ?%r10d, (%rdi,%rax)
>> > ? ? ? ?movl ? ?4(%rdx,%rax), %r9d
>> > ? ? ? ?imull ? 4(%rsi,%rax), %r9d
>> > ? ? ? ?movl ? ?%r9d, 4(%rdi,%rax)
>> > ? ? ? ?movl ? ?8(%rdx,%rax), %r8d
>> > ? ? ? ?imull ? 8(%rsi,%rax), %r8d
>> > ? ? ? ?movl ? ?%r8d, 8(%rdi,%rax)
>> > ? ? ? ?movl ? ?12(%rdx,%rax), %ecx
>> > ? ? ? ?imull ? 12(%rsi,%rax), %ecx
>> > ? ? ? ?movl ? ?%ecx, 12(%rdi,%rax)
>> > ? ? ? ?addq ? ?$16, %rax
>> > ? ? ? ?cmpq ? ?$400, %rax
>> > ? ? ? ?jne ? ? .L2
>> > ? ? ? ?rep
>> >
>> > This used to compile efficiently on our 4.4 port. Any comments?
>>
>> It's due to TMR_ORIGINAL being used for MEM_EXPRs during
>> expansion (and TMRs not being handled by the alias oracles
>> well). ?I can look at this if you file a bugreport, so I remember.
>>
>> A patch as simple as
>>
>> Index: expr.c
>> ===================================================================
>> --- expr.c ? ? ?(revision 162841)
>> +++ expr.c ? ? ?(working copy)
>> @@ -8665,7 +8665,7 @@ expand_expr_real_1 (tree exp, rtx target
>> ? ? ? ? set_mem_addr_space (temp, as);
>> ? ? ? ? base = get_base_address (TMR_ORIGINAL (exp));
>> ? ? ? ? if (base
>> - ? ? ? ? ? && INDIRECT_REF_P (base)
>> + ? ? ? ? ? && (INDIRECT_REF_P (base) || TREE_CODE (base) == MEM_REF)
>> ? ? ? ? ? ? && TMR_BASE (exp)
>> ? ? ? ? ? ? && TREE_CODE (TMR_BASE (exp)) == SSA_NAME
>> ? ? ? ? ? ? && POINTER_TYPE_P (TREE_TYPE (TMR_BASE (exp))))
>>
> Thanks, this patch works with trunk x86.
>
>> might help. ?On the 4.5 branch you need to backport the various
>> changes to retain points-to info during IVOPTs (or use -fno-tree-
>> ivopts).
>
> Is this gigantic patch you referring to?

No, more like

2010-07-23  Richard Guenther  <rguenther@suse.de>

        PR tree-optimization/45037
        * tree-ssa-loop-ivopts.c (copy_ref_info): Handle NULL base.

2010-07-05  Richard Guenther  <rguenther@suse.de>

        * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Copy alias info.

2010-07-05  Richard Guenther  <rguenther@suse.de>

        * tree.c (reference_alias_ptr_type): New function.
        * tree.h (reference_alias_ptr_type): Declare.
        * tree-ssa-loop-ivopts.c (copy_ref_info): Restructure to
        allow non-TARGET_MEM_REF new refs.
        (rewrite_use_address): Pass old alias pointer type to create_mem_ref.
        * tree-ssa-address.c (create_mem_ref_raw): Get alias pointer type.
        Build a MEM_REF instead of a TARGET_MEM_REF if possible.
        (create_mem_ref): Get alias pointer type.  Adjust calls to
        create_mem_ref_raw.
        (maybe_fold_tmr): Likewise.
        * tree-flow.h (create_mem_ref): Adjust prototype.

2010-07-04  Richard Guenther  <rguenther@suse.de>

        PR tree-optimization/44479
        * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Avoid
        extra SSA name copy statements which preserves points-to
        information.
        * tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref):
        Copy points-to information for all pointers.  Properly handle
        MEM_REFs.
        (vect_create_data_ref_ptr): Likewise.  Avoid extra SSA name
        copy statements.
        * Makefile.in (tree-ssa-loop-ivopts.o): Add tree-ssa-propagate.h
        dependency.

2010-07-02  Richard Guenther  <rguenther@suse.de>

        * tree-ssa-structalias.c (pt_solution_set_var): New function.
        * tree-ssa-alias.h (pt_solution_set_var): Declare.
        * tree-ssa-loop-ivopts.c (copy_ref_info): Also copy or create
        points-to information.

well - all the pieces that apply.  The above went in after the
gigantic patch you refered to which makes most pieces need
adjustments for the branch.

RIchard.


> 2010-07-01 ?Richard Guenther ?<rguenther@suse.de>
>
> ? ? ? ?PR middle-end/42834
> ? ? ? ?PR middle-end/44468
> ? ? ? ?* doc/gimple.texi (is_gimple_mem_ref_addr): Document.
> ? ? ? ?* doc/generic.texi (References to storage): Document MEM_REF.
> ? ? ? ?* tree-pretty-print.c (dump_generic_node): Handle MEM_REF.
> ? ? ? ?(print_call_name): Likewise.
> ? ? ? ?* tree.c (recompute_tree_invariant_for_addr_expr): Handle MEM_REF.
> ? ? ? ?(build_simple_mem_ref_loc): New function.
> ? ? ? ?(mem_ref_offset): Likewise.
> ? ? ? ?* tree.h (build_simple_mem_ref_loc): Declare.
> ? ? ? ?(build_simple_mem_ref): Define.
> ? ? ? ?(mem_ref_offset): Declare.
> ? ? ? ?* fold-const.c: Include tree-flow.h.
> ? ? ? ?(operand_equal_p): Handle MEM_REF.
> ? ? ? ?(build_fold_addr_expr_with_type_loc): Likewise.
> ? ? ? ?(fold_comparison): Likewise.
> ? ? ? ?(fold_unary_loc): Fold
> ? ? ? ?VIEW_CONVERT_EXPR <T1, MEM_REF <T2, ...>> to MEM_REF <T1, ...>.
> ? ? ? ?(fold_binary_loc): Fold MEM[&MEM[p, CST1], CST2] to MEM[p, CST1 + CST2],
> ? ? ? ?fold MEM[&a.b, CST2] to MEM[&a, offsetof (a, b) + CST2].
> ? ? ? ?* tree-ssa-alias.c (ptr_deref_may_alias_decl_p): Handle MEM_REF.
> ? ? ? ?(ptr_deref_may_alias_ref_p_1): Likewise.
> ? ? ? ?(ao_ref_base_alias_set): Properly differentiate base object for
> ? ? ? ?offset and TBAA.
> ? ? ? ?(ao_ref_init_from_ptr_and_size): Use MEM_REF.
> ? ? ? ?(indirect_ref_may_alias_decl_p): Handle MEM_REFs properly.
> ? ? ? ?(indirect_refs_may_alias_p): Likewise.
> ? ? ? ?(refs_may_alias_p_1): Likewise. ?Remove pointer SSA name def
> ? ? ? ?chasing code.
> ? ? ? ?(ref_maybe_used_by_call_p_1): Handle MEM_REF.
> ? ? ? ?(call_may_clobber_ref_p_1): Likewise.
> ? ? ? ?* dwarf2out.c (loc_list_from_tree): Handle MEM_REF.
>>
>> Thanks,
>> Richard.
>
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]