[llvm-dev] Extracting the names of the variables that creates loop-carried dependencies

Miguel Aguilar via llvm-dev llvm-dev at lists.llvm.org
Fri Aug 5 05:42:12 PDT 2016


Hi Michael,

Thanks for your answer. Checking the indexes looks as an another
straightforward  approach to identify the actual loop-carried dependencies.

What is not clear to me still is how it looks like the code to extract the
ScopArrayInfo pointer from the user part.

Miguel

On 08/05/2016 02:32 PM, Michael Kruse wrote:
> I just realized this is a crossposting llvm-dev/polly-dev. It has
> already been answered on the polly-dev side. Sorry for the redundant
> answer.
>
> Michael
>
> 2016-08-05 14:25 GMT+02:00 Michael Kruse <llvmdev at meinersbur.de>:
>> Hi Miguel,
>>
>> Polly's DependenceInfo will give you the required information. For
>> your example the result is
>>
>>          RAW dependences:
>>                  [A_ROW, B_COL] -> { Stmt_for_body4[i0, i1] ->
>> Stmt_for_body4[i0, 1 + i1] : 0 <= i0 < A_ROW and 0 <= i1 <= -3 + B_COL
>> }
>>          WAR dependences:
>>                  [A_ROW, B_COL] -> {  }
>>          WAW dependences:
>>                  [A_ROW, B_COL] -> {  }
>>
>> In this case you see that it is a loop-carried dependency because in
>> the second dimension the instruction depends on a previous iteration
>> ("i0 -> i0 +1"). You can check this computationally using ISL
>> operations by subtracting the identity map (dependences within one
>> iteration) from the dependence map is see whether it is empty.
>>
>> Dependence can also tell which array/element triggers the dependence
>> using Dependences::AL_Reference/AL_Access level setting.
>>
>> For all the statements in a loop, iterate over all dependence, see
>> whether one dimension is the loop is interested in, compare the
>> prefixes up to that dimension (to know whether the outermost loops are
>> within the iteration) and finally again compare the indices of the
>> dimension you are interested in.
>>
>> To finally get the array name, extract the ScopArrayInfo object
>> pointer hidden in the user part of the tuple id.
>> ScopArrayInfo::getBasePtr() gives you the array's base. For instance,
>> it will be an llvm::Argument, but could also be any expression that
>> computes the basepointer, eg. doesn't necessarily have a name from the
>> source code.
>>
>> Michael
>>
>>
>>
>> 2016-08-03 19:13 GMT+02:00 Miguel Aguilar via llvm-dev
>> <llvm-dev at lists.llvm.org>:
>>> Hi,
>>>
>>> I would like to know if it is possible to extract the source level names of
>>> variables that create loop-carried dependencies.
>>>
>>> For example, for the following code:
>>>
>>>      for (int i = 0; i < A_ROW; i++)
>>>      {
>>>          for (int j = 1; j < B_COL; j++)
>>>          {
>>>              a_matrix[i][j] = a_matrix[i][j - 1];
>>>          }
>>>      }
>>>
>>> I get the following  AST:
>>>
>>>        #pragma omp parallel for
>>>        for (int c0 = 0; c0 <= 31; c0 += 1)
>>>          #pragma minimal dependence distance: 1
>>>          for (int c1 = 0; c1 <= 30; c1 += 1)
>>>            Stmt_for_body5(c0, c1);
>>>
>>> As expected the second loop has a dependence distance of 1. Then, here is
>>> when I would like to know if
>>> it possible to extract the name of the variable (a_matrix) e.g. by
>>> developing a custom LLVM pass, based on
>>> Polly passes.
>>>
>>> Thanks,
>>> Miguel
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list