[Bug c/54803] New: Manual constant unfolding breaks vectorization
jasongross9+bugzilla at gmail dot com
gcc-bugzilla@gcc.gnu.org
Thu Oct 4 00:00:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54803
Bug #: 54803
Summary: Manual constant unfolding breaks vectorization
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: jasongross9+bugzilla@gmail.com
Created attachment 28348
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28348
code files
Manually unfolding constants sometimes prevents vectorization.
For example, these loops vectorize:
void multi_left_shift0(uint64_t *const array, size_t len, size_t num_bits) {
for (size_t i = 0; i < len; i++) {
array[i] = (array[i] >> 31) | (array[i] << 31);
}
}
void multi_left_shift2(uint64_t *const array, size_t len, size_t num_bits) {
for (size_t i = 0; i < len; i++) {
const uint64_t tempa = array[i] >> 32;
const uint64_t tempb = array[i] << 32;
array[i] = tempa | tempb;
}
}
but this loops does not:
void multi_left_shiftb0(uint64_t *const array, size_t len, size_t num_bits) {
for (size_t i = 0; i < len; i++) {
array[i] = (array[i] >> 32) | (array[i] << 32);
}
}
See attached file for the code, preprocessed code, gcc command line log, and
assembly.
More information about the Gcc-bugs
mailing list