[Bug c/54894] New: internal compiler error: in vect_get_vec_def_for_operand, at tree-vect-stmts.c:1286
kuszmaul at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Oct 10 18:28:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54894
Bug #: 54894
Summary: internal compiler error: in
vect_get_vec_def_for_operand, at
tree-vect-stmts.c:1286
Classification: Unclassified
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: kuszmaul@gmail.com
Created attachment 28415
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28415
preprocessed code for matrix multiply
I'm having trouble getting gcc to remember alignment information the attached
matrix multiplication code. So I introduced a temporary variable that is a
pointer to a 16-byte aligned double, and ended up with this error:
$ gcc -O3 -std=c99 mm_tile.c -Wcast-align -o mm_tile
mm_tile.c: In function ‘main’:
mm_tile.c:46:5: internal compiler error: in vect_get_vec_def_for_operand, at
tree-vect-stmts.c:1286
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
Preprocessed source stored into /tmp/ccvYpDPi.out file, please attach this to
your bugreport.
$ gcc --version
gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cat mm_tile.c
/** BEGIN HIDDEN **/
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
typedef unsigned long long uint64_t;
/* Allow us to change n on the compiler command line with for example -Dn=1024
*/
#ifndef n
#define n 4096
#endif
double A[n][n] __attribute__((aligned(16)));
double B[n][n] __attribute__((aligned(16)));
double C[n][n] __attribute__((aligned(16)));
static float tdiff (struct timeval *start,
struct timeval *end) {
return (end->tv_sec-start->tv_sec)
+1e-6*(end->tv_usec-start->tv_usec);
}
#include "verify.h"
#define tilesize 128
/* void mmbase (double *restrict C, double *restrict A, double *restrict B) {
*/
/* for (int kh = 0; kh < n; kh += tilesize) { */
/* for (int il = 0; il < tilesize; il++) { */
/* for (int kl = 0; kl < tilesize; ++kl) { */
/* for (int jl = 0; jl < tilesize; jl++) { */
/* C[il*n+jl] += A[il*n+kh+kl]*B[(kh+kl)*n+jl]; */
/* } */
/* } */
/* } */
/* } */
/* } */
/* void mm_js(double *restrict C, double *restrict A, double *restrict B) { */
/* for (int jh = 0; jh < n; jh += tilesize) { */
/* mmbase(&C[jh], &A[0], &B[jh]); */
/* } */
/* } */
typedef double adouble __attribute__((__aligned__(16)));
int main(int argc, const char *argv[]) {
parse_args(argc, argv);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
A[i][j] = (double)rand() / (double)RAND_MAX;
B[i][j] = (double)rand() / (double)RAND_MAX;
C[i][j] = 0;
} }
struct timeval start, end;
gettimeofday(&start, NULL);
/** END HIDDEN **/
for (int ih = 0; ih < n; ih += tilesize) {
///\lilabel{block_loop_i}
for (int jh = 0; jh < n; jh += tilesize) {
///\lilabel{block_loop_k}
for (int kh = 0; kh < n; kh += tilesize) {
///\lilabel{block_loop_j}
for (int il = 0; il < tilesize; ++il) {
///\lilabel{base_loop_i}
adouble *Ap = (adouble *)&A[ih+il][kh];
for (int kl = 0; kl < tilesize; ++kl) {
///\lilabel{base_loop_k}
for (int jl = 0; jl < tilesize; ++jl) {
///\lilabel{base_loop_j}
C[ih+il][jh+jl] += Ap[kl] * B[kh+kl][jh+jl];
///\lilabel{base_multiply}
} } }
}
/* mmbase(&C[ih][jh],&A[ih][0],&B[0][jh]); */
}
/* mm_js(&C[ih][0], &A[ih][0], &B[0][0]); */
}
/** BEGIN HIDDEN **/
gettimeofday(&end, NULL);
printf("%0.6f\n", tdiff(&start, &end));
if (need_to_verify) verify();
return 0;
}
/** END HIDDEN **/
More information about the Gcc-bugs
mailing list