From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23841 invoked by alias); 18 May 2010 01:22:57 -0000 Received: (qmail 23818 invoked by uid 48); 18 May 2010 01:22:45 -0000 Date: Tue, 18 May 2010 01:22:00 -0000 Subject: [Bug tree-optimization/44183] New: Vectorizer may generate invalid memory access X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "hjl dot tools at gmail dot com" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2010-05/txt/msg01881.txt.bz2 For --- #define N 16 float b[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; float a[N]; void test (void) { int i; for (i = 0; i < N/2; i++) a[i] = b[2*i+1] * c[2*i+1]; } --- vectorizer generates: test () { unsigned int ivtmp.30; vector(4) float * vect_pa.29; vector(4) float * vect_pa.26; vector(4) float vect_var_.25; vector(4) float vect_perm_odd.24; vector(4) float vect_perm_even.23; vector(4) float vect_var_.22; vector(4) float vect_var_.21; vector(4) float * c.20; vector(4) float * vect_pc.19; vector(4) float * vect_pc.16; vector(4) float vect_perm_odd.15; vector(4) float vect_perm_even.14; vector(4) float vect_var_.13; vector(4) float vect_var_.12; vector(4) float * b.11; vector(4) float * vect_pb.10; vector(4) float * vect_pb.7; unsigned int ivtmp.6; int i; float D.2731; float D.2730; float D.2729; int D.2728; int D.2727; : b.11_18 = (vector(4) float *) &b; vect_pb.10_21 = b.11_18 + 4; vect_pb.7_22 = vect_pb.10_21; c.20_30 = (vector(4) float *) &c; vect_pc.19_31 = c.20_30 + 4; vect_pc.16_32 = vect_pc.19_31; vect_pa.29_41 = (vector(4) float *) &a; vect_pa.26_42 = vect_pa.29_41; : # i_14 = PHI # ivtmp.6_20 = PHI # vect_pb.7_23 = PHI # vect_pc.16_33 = PHI # vect_pa.26_43 = PHI # ivtmp.30_45 = PHI D.2727_3 = i_14 * 2; D.2728_4 = D.2727_3 + 1; vect_var_.12_25 = M*vect_pb.7_23{misalignment: 32}; vect_pb.7_26 = vect_pb.7_23 + 16; vect_var_.13_27 = M*vect_pb.7_26{misalignment: 32}; vect_perm_even.14_28 = VEC_EXTRACTEVEN_EXPR ; vect_perm_odd.15_29 = VEC_EXTRACTODD_EXPR ; D.2729_5 = b[D.2728_4]; vect_var_.21_35 = M*vect_pc.16_33{misalignment: 32}; vect_pc.16_36 = vect_pc.16_33 + 16; vect_var_.22_37 = M*vect_pc.16_36{misalignment: 32}; vect_perm_even.23_38 = VEC_EXTRACTEVEN_EXPR ; vect_perm_odd.24_39 = VEC_EXTRACTODD_EXPR ; D.2730_8 = c[D.2728_4]; vect_var_.25_40 = vect_perm_even.14_28 * vect_perm_even.23_38; D.2731_9 = D.2729_5 * D.2730_8; *vect_pa.26_43 = vect_var_.25_40; i_10 = i_14 + 1; ivtmp.6_19 = ivtmp.6_20 - 1; vect_pb.7_24 = vect_pb.7_26 + 16; vect_pc.16_34 = vect_pc.16_36 + 16; vect_pa.26_44 = vect_pa.26_43 + 16; ivtmp.30_46 = ivtmp.30_45 + 1; if (ivtmp.30_46 < 2) goto ; else goto ; : goto ; : return; } The problem is D.2727_3 = i_14 * 2; D.2728_4 = D.2727_3 + 1; vect_var_.12_25 = M*vect_pb.7_23{misalignment: 32}; vect_pb.7_26 = vect_pb.7_23 + 16; vect_var_.13_27 = M*vect_pb.7_26{misalignment: 32}; vect_perm_even.14_28 = VEC_EXTRACTEVEN_EXPR ; vect_perm_odd.15_29 = VEC_EXTRACTODD_EXPR ; may access memory beyond the array boundary, depending on how VEC_EXTRACTEVEN_EXPR and VEC_EXTRACTODD_EXPR are implemented in backend. The misaligned assess: vect_var_.12_25 = M*vect_pb.7_23{misalignment: 32}; vect_var_.13_27 = M*vect_pb.7_26{misalignment: 32}; may read one element outside of array if backend needs to read in the whole misaligned memory. -- Summary: Vectorizer may generate invalid memory access Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: hjl dot tools at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44183