https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61724

            Bug ID: 61724
           Summary: Some loops not vectorised
           Product: gcc
           Version: 4.7.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dzidzitop at vfemail dot net

Created attachment 33075
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33075&action=edit
Test code

Some loops inside C++ classes are not vectorised by the tree-vectorise driver.
Attached is an example. In it, the pairs {A::f(), A::h()} and {A::g(), A::k()}
are twins, with subtle differences in how they are implemented:
- A::f() uses condition on this->size; A::g() reads this->size into the
register variable n
- A::g() reads data from this->y (std::unique_ptr); A::k() copies the same
pointer to a local T * variable.

In both cases only the loop within the second pair member is vectorised.
Here is the compiler output.

$ g++ -std=c++11 -fPIC -O3 -ftree-vectorizer-verbose=6 test.cpp 

Analyzing loop at test.cpp:44

44: versioning for alias required: can't determine dependence between
*D.24505_63 and *D.24502_62
44: mark for run-time aliasing test between *D.24505_63 and *D.24502_62
44: Vectorizing an unaligned access.
44: Vectorizing an unaligned access.
44: vect_model_load_cost: unaligned supported by hardware.
44: vect_model_load_cost: inside_cost = 2, outside_cost = 0 .
44: vect_model_store_cost: unaligned supported by hardware.
44: vect_model_store_cost: inside_cost = 2, outside_cost = 0 .
44: cost model: Adding cost of checks for loop versioning aliasing.

44: cost model: epilogue peel iters set to vf/2 because loop iterations are
unknown .
44: Cost model analysis: 
  Vector inside of loop cost: 4
  Vector outside of loop cost: 26
  Scalar iteration cost: 2
  Scalar outside cost: 1
  prologue iterations: 0
  epilogue iterations: 8
  Calculated minimum iters for profitability: 14

44:   Profitability threshold = 15


Vectorizing loop at test.cpp:44

44: Profitability threshold is 15 loop iterations.
44: create runtime check for data references *D.24505_63 and *D.24502_62
44: created 1 versioning for alias checks.

44: LOOP VECTORIZED.
Analyzing loop at test.cpp:22

22: versioning for alias required: can't determine dependence between
*D.24457_38 and *D.24458_37
22: mark for run-time aliasing test between *D.24457_38 and *D.24458_37
22: Vectorizing an unaligned access.
22: Vectorizing an unaligned access.
22: vect_model_load_cost: unaligned supported by hardware.
22: vect_model_load_cost: inside_cost = 2, outside_cost = 0 .
22: vect_model_store_cost: unaligned supported by hardware.
22: vect_model_store_cost: inside_cost = 2, outside_cost = 0 .
22: cost model: Adding cost of checks for loop versioning aliasing.

22: cost model: epilogue peel iters set to vf/2 because loop iterations are
unknown .
22: Cost model analysis: 
  Vector inside of loop cost: 4
  Vector outside of loop cost: 26
  Scalar iteration cost: 2
  Scalar outside cost: 1
  prologue iterations: 0
  epilogue iterations: 8
  Calculated minimum iters for profitability: 14

22:   Profitability threshold = 15


Vectorizing loop at test.cpp:22

22: Profitability threshold is 15 loop iterations.
22: create runtime check for data references *D.24457_38 and *D.24458_37
22: created 1 versioning for alias checks.

22: LOOP VECTORIZED.
Analyzing loop at test.cpp:34

34: not vectorized: not suitable for gather D.24489_53 = *D.24485_52;

Analyzing loop at test.cpp:12

12: not vectorized: number of iterations cannot be computed.
test.cpp:49: note: vectorized 2 loops in function.

Reply via email to