[Bug tree-optimization/66288] parallelized loop vectorized with runtime alias check

2015-05-26 Thread vries at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66288

--- Comment #2 from vries at gcc dot gnu.org ---
Before parallelization, we have:
...
  doubleD.32 dataD.1837[1000];
  doubleD.32 resultsD.1836[1000];

  ...

  # VUSE <.MEM_19>
  _6 = dataD.1837[idx_18];
  _7 = _6 * 1.2199289457264239899814128875732421875e+1;
  # .MEM_8 = VDEF <.MEM_19>
  resultsD.1836[idx_18] = _7;
...

We could annotate these memory references with dependence clique information.


[Bug tree-optimization/66288] parallelized loop vectorized with runtime alias check

2015-05-26 Thread vries at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66288

--- Comment #1 from vries at gcc dot gnu.org ---
Note that for the example from PR66285, with INDEX_TYPE long/unsigned long, we
vectorize without run-time aliasing test.

In that example, we start out with two restrict pointers. During aliasing, we
determine clique and base:
...
  # VUSE <.MEM_23>
  _9 = MEM[(doubleD.32 *)_8 clique 1 base 2];

  _10 = _9 * 1.2199289457264239899814128875732421875e+1;

  # .MEM_11 = VDEF <.MEM_23>
  MEM[(doubleD.32 *)_6 clique 1 base 1] = _10;
...

That information is preserved after function splitoff due to parallelization:
...
  # VUSE <.MEM_32>
  _28 = MEM[(doubleD.32 *)_27 clique 1 base 2];

  _29 = _28 * 1.2199289457264239899814128875732421875e+1;

  # .MEM_35 = VDEF <.MEM_32>
  MEM[(doubleD.32 *)_26 clique 1 base 1] = _29;
...

So the dependence clique is used to do disambiguation.