"Bin.Cheng" <amker.ch...@gmail.com> writes:
> On Wed, Jun 28, 2017 at 2:36 PM, Richard Sandiford
> <richard.sandif...@linaro.org> wrote:
>> Index: gcc/tree-data-ref.c
>> ===================================================================
>> --- gcc/tree-data-ref.c 2017-06-28 14:33:41.294720044 +0100
>> +++ gcc/tree-data-ref.c 2017-06-28 14:35:30.475155670 +0100
>> @@ -749,15 +749,29 @@ canonicalize_base_object_address (tree a
>>    return build_fold_addr_expr (TREE_OPERAND (addr, 0));
>>  }
>>
>> -/* Analyzes the behavior of the memory reference DR in the innermost loop or
>> -   basic block that contains it.  Returns true if analysis succeed or false
>> -   otherwise.  */
>> +/* Analyze the behavior of memory reference DR.  There are two modes:
>> +
>> +   - BB analysis.  In this case we simply split the address into base,
>> +     init and offset components, without reference to any containing loop.
>> +     The resulting base and offset are general expressions and they can
>> +     vary arbitrarily from one iteration of the containing loop to the next.
>> +     The step is always zero.
>> +
>> +   - loop analysis.  In this case we analyze the reference both wrt LOOP
>> +     and on the basis that the reference occurs (is "used") in LOOP;
>> +     see the comment above analyze_scalar_evolution_in_loop for more
>> +     information about this distinction.  The base, init, offset and
>> +     step fields are all invariant in LOOP.
>> +
>> +   Perform BB analysis if LOOP is null, or if LOOP is the function's
>> +   dummy outermost loop.  In other cases perform loop analysis.
>> +
>> +   Return true if the analysis succeeded and store the results in DR if so.
>> +   BB analysis can only fail for bitfield or reversed-storage accesses.  */
>>
>>  bool
>> -dr_analyze_innermost (struct data_reference *dr, struct loop *nest)
>> +dr_analyze_innermost (struct data_reference *dr, struct loop *loop)
>>  {
>> -  gimple *stmt = DR_STMT (dr);
>> -  struct loop *loop = loop_containing_stmt (stmt);
>>    tree ref = DR_REF (dr);
>>    HOST_WIDE_INT pbitsize, pbitpos;
>>    tree base, poffset;
>> @@ -806,22 +820,11 @@ dr_analyze_innermost (struct data_refere
>>
>>    if (in_loop)
> A nit.  No need to use bool variable now?  We can check loop != NULL instead.

As the comment says, we also want to do BB analysis if the loop is the
outermost dummy loop, so in_loop remains set to:

  bool in_loop = (loop && loop->num);

I think it's worth keeping that abstraction.

Thanks,
Richard

Reply via email to