This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Vectorization: Loop peeling with misaligned support.
- From: "Bingfeng Mei" <bmei at broadcom dot com>
- To: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Fri, 15 Nov 2013 13:16:38 +0000
- Subject: Vectorization: Loop peeling with misaligned support.
- Authentication-results: sourceware.org; auth=none
Hi,
In loop vectorization, I found that vectorizer insists on loop peeling even our target supports misaligned memory access. This results in much bigger code size for a very simple loop. I defined TARGET_VECTORIZE_SUPPORT_VECTOR_MISALGINMENT and also TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST to make misaligned accesses almost as cheap as an aligned one. But the vectorizer still does peeling anyway.
In vect_enhance_data_refs_alignment function, it seems that result of vect_supportable_dr_alignment is not used in decision of whether to do peeling.
supportable_dr_alignment = vect_supportable_dr_alignment (dr, true);
do_peeling = vector_alignment_reachable_p (dr);
Later on, there is code to compare load/store costs. But it only decides whether to do peeling for load or store, not whether to do peeling.
Currently I have a workaround. For the following simple loop, the size is 80bytes vs. 352 bytes without patch (-O2 -ftree-vectorize gcc 4.8.3 20131114)
int A[100];
int B[100];
void foo2() {
int i;
for (i = 0; i < 100; ++i)
A[i] = B[i] + 100;
}
What is the best way to tell vectorizer not to do peeling in such situation?
Thanks,
Bingfeng Mei
Broadcom UK