This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Vectorizing HIRLAM 4: complicated access patterns examined.
- From: Toon Moene <toon at moene dot indiv dot nluug dot nl>
- To: DORIT at il dot ibm dot com, toon at moene dot indiv dot nluug dot nl
- Cc: fortran at gcc dot gnu dot org, gcc at gcc dot gnu dot org
- Date: Sat, 22 Oct 2005 12:18:57 +0200
- Subject: Re: Vectorizing HIRLAM 4: complicated access patterns examined.
This one gets vectorized for me, on powerpc-linux:
~/mainline_cvs/bin/gfortran -O3 -ftree-vectorize -maltivec
-ftree-vectorizer-verbose=4 -S hilaram4.f90
hilaram4.f90:4: note: Alignment of access forced using peeling.
hilaram4.f90:4: note: Vectorizing an unaligned access.
hilaram4.f90:4: note: LOOP VECTORIZED.
hilaram4.f90:7: note: vectorized 1 loops in function.
dorit
> L.S.,
>
> This code:
>
> SUBROUTINE S(N)
> DIMENSION A(N), B(N)
> READ*,ISTART,ISTOP,B
> DO I = ISTART, ISTOP
> A(I) = B(I)
> ENDDO
> PRINT*,A
> END
>
> when compiled thusly:
>
> $ gfortran -g -S -O3 -ftree-vectorize -ftree-vectorizer-verbose=2 -
> msse2 vect4.f
>
> draws the following "not vectorized" message:
>
> vect4.f:4: note: not vectorized: complicated access pattern.
> vect4.f:4: note: vectorized 0 loops in function.
I get the following, using the autovect branch compiler on
x86_64-unknown-linux-gnu:
vect4.f:4: note: ===== analyze_loop_nest =====
vect4.f:4: note: === vect_analyze_loop_form ===
vect4.f:4: note: split exit edge.
vect4.f:4: note: === get_loop_niters ===
vect4.f:4: note: ==> get_loop_niters:(<unnamed type>) (D.813_29 - i_27) + 1
vect4.f:4: note: Symbolic number of iterations is (<unnamed type>) (D.813_29 - i_27) + 1
vect4.f:4: note: === vect_analyze_data_refs ===
vect4.f:4: note: get vectype with 4 units of type real4
vect4.f:4: note: vectype: vector real4
vect4.f:4: note: get vectype with 4 units of type real4
vect4.f:4: note: vectype: vector real4
vect4.f:4: note: === vect_analyze_scalar_cycles ===
vect4.f:4: note: Analyze phi: HEAP.49_363 = PHI <HEAP.49_380(5), HEAP.49_381(7)>;
vect4.f:4: note: virtual phi. skip.
vect4.f:4: note: Analyze phi: HEAP.42_259 = PHI <HEAP.42_268(5), HEAP.42_268(7)>;
vect4.f:4: note: virtual phi. skip.
vect4.f:4: note: Analyze phi: HEAP.35_60 = PHI <HEAP.35_312(5), HEAP.35_312(7)>;
vect4.f:4: note: virtual phi. skip.
vect4.f:4: note: Analyze phi: i_1 = PHI <i_27(5), i_45(7)>;
vect4.f:4: note: Access function of PHI: {i_27, +, 1}_2
vect4.f:4: note: step: 1, init: i_27
vect4.f:4: note: Detected induction.
vect4.f:4: note: === vect_pattern_recog ===
vect4.f:4: note: === vect_mark_stmts_to_be_vectorized ===
vect4.f:4: note: init: phi relevant? HEAP.49_363 = PHI <HEAP.49_380(5), HEAP.49_381(7)>;
vect4.f:4: note: init: phi relevant? HEAP.42_259 = PHI <HEAP.42_268(5), HEAP.42_268(7)>;
vect4.f:4: note: init: phi relevant? HEAP.35_60 = PHI <HEAP.35_312(5), HEAP.35_312(7)>;
vect4.f:4: note: init: phi relevant? i_1 = PHI <i_27(5), i_45(7)>;
vect4.f:4: note: init: stmt relevant? <L14>:
vect4.f:4: note: init: stmt relevant? D.830_39 = (int8) i_1
vect4.f:4: note: init: stmt relevant? D.831_40 = D.830_39 + -1
vect4.f:4: note: init: stmt relevant? D.832_43 = (*b_10)[D.831_40]
vect4.f:4: note: init: stmt relevant? (*a_16)[D.831_40] = D.832_43
vect4.f:4: note: vec_stmt_relevant_p: stmt has vdefs.
vect4.f:4: note: mark relevant 2, live 0.
vect4.f:4: note: init: stmt relevant? i_45 = i_1 + 1
vect4.f:4: note: init: stmt relevant? if (i_1 == D.813_29) goto <L35>; else goto <L29>;
vect4.f:4: note: init: stmt relevant? <L29>:
vect4.f:4: note: worklist: examine stmt: (*a_16)[D.831_40] = D.832_43
vect4.f:4: note: vect_is_simple_use: operand D.832_43
vect4.f:4: note: def_stmt: D.832_43 = (*b_10)[D.831_40]
vect4.f:4: note: type of def: 2.
vect4.f:4: note: worklist: examine use 2: D.832_43
vect4.f:4: note: mark relevant 2, live 0.
vect4.f:4: note: worklist: examine stmt: D.832_43 = (*b_10)[D.831_40]
vect4.f:4: note: === vect_analyze_data_refs_alignment ===
vect4.f:4: note: vect_compute_data_ref_alignment:
vect4.f:4: note: Unknown alignment for access: *b_10
vect4.f:4: note: vect_compute_data_ref_alignment:
vect4.f:4: note: Unknown alignment for access: *a_16
vect4.f:4: note: === vect_determine_vectorization_factor ===
vect4.f:4: note: ==> examining statement: <L14>:
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: D.830_39 = (int8) i_1
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: D.831_40 = D.830_39 + -1
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: D.832_43 = (*b_10)[D.831_40]
vect4.f:4: note: vectype: vector real4
vect4.f:4: note: nunits = 4
vect4.f:4: note: ==> examining statement: (*a_16)[D.831_40] = D.832_43
vect4.f:4: note: vectype: vector real4
vect4.f:4: note: nunits = 4
vect4.f:4: note: ==> examining statement: i_45 = i_1 + 1
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: if (i_1 == D.813_29) goto <L35>; else goto <L29>;
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: <L29>:
vect4.f:4: note: skip.
vect4.f:4: note: === vect_determine_vectorization_factor ===
vect4.f:4: note: ==> examining statement: <L14>:
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: D.830_39 = (int8) i_1
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: D.831_40 = D.830_39 + -1
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: D.832_43 = (*b_10)[D.831_40]
vect4.f:4: note: vectype: vector real4
vect4.f:4: note: nunits = 4
vect4.f:4: note: ==> examining statement: (*a_16)[D.831_40] = D.832_43
vect4.f:4: note: vectype: vector real4
vect4.f:4: note: nunits = 4
vect4.f:4: note: ==> examining statement: i_45 = i_1 + 1
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: if (i_1 == D.813_29) goto <L35>; else goto <L29>;
vect4.f:4: note: skip.
vect4.f:4: note: ==> examining statement: <L29>:
vect4.f:4: note: skip.
vect4.f:4: note: === vect_analyze_dependences ===
vect4.f:4: note: === vect_analyze_data_ref_accesses ===
vect4.f:4: note: not consecutive access
^^^^^^^^^^^^^^^^^^^^^^ This is incorrect. The accesses *are*
consecutive; it's just that there is
a "jump" at the beginning.
vect4.f:4: note: not vectorized: complicated access pattern.
vect4.f:4: note: bad data access.
Hope this helps.
Kind regards,
--
Toon Moene - e-mail: toon@moene.indiv.nluug.nl - phone: +31 346 214290
Saturnushof 14, 3738 XG Maartensdijk, The Netherlands
A maintainer of GNU Fortran 95: http://gcc.gnu.org/fortran/