http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49513
--- Comment #2 from vincenzo Innocente <vincenzo.innocente at cern dot ch> 2011-06-23 12:16:59 UTC --- thanks for the fast analysis. the code in question was there also to test what the vectorized code would do for x=0 and y=0 (it is extracted from a simplified version of atan2f that gcc can vectorize). Being a test, I can workaround (I've to test extreme conditions explicitely anyhow). In any case I think that any peeling will ruin alignmement. hoping gcc can find ways to avoid PRE and vectorization to clash. vincenzo On 23 Jun, 2011, at 1:55 PM, rguenth at gcc dot gnu.org wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49513 > > Richard Guenther <rguenth at gcc dot gnu.org> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > Status|UNCONFIRMED |NEW > Keywords| |missed-optimization > Last reconfirmed| |2011.06.23 11:55:09 > CC| |rguenth at gcc dot gnu.org > Ever Confirmed|0 |1 > Summary|introducing a product |PRE inhibits if-conversion > |inhibit vectorization |and vectorization > > --- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-06-23 > 11:55:09 UTC --- > That is because PRE decided to optimize the first iteration where it knows > that z == 0 and thus z*s[i] and z*c[i] are 0 and thus a[i] will be 0. Which > means we confuse if-conversion which in turn causes this missed vectorization. > IL before if-conversion: > > <bb 2>: > goto <bb 6>; > > <bb 3>: > z_3 = (float) i_9; > D.3280_4 = c[i_9]; > D.3281_5 = D.3280_4 * z_3; > D.3282_6 = s[i_9]; > D.3283_7 = D.3282_6 * z_3; > yy_13 = ABS_EXPR <D.3281_5>; > yy_14 = ABS_EXPR <D.3283_7>; > if (yy_13 < yy_14) > goto <bb 5>; > else > goto <bb 4>; > > <bb 4>: > > <bb 5>: > # yy_28 = PHI <yy_13(4), yy_14(3)> > # yy_29 = PHI <yy_14(4), yy_13(3)> > > <bb 6>: > # yy_16 = PHI <yy_28(5), 0.0(2)> > # yy_15 = PHI <yy_29(5), 0.0(2)> > # i_30 = PHI <i_9(5), 0(2)> > # ivtmp.44_24 = PHI <ivtmp.44_10(5), 1024(2)> > t_17 = yy_15 / yy_16; > a[i_30] = t_17; > i_9 = i_30 + 1; > ivtmp.44_10 = ivtmp.44_24 - 1; > if (ivtmp.44_10 != 0) > goto <bb 3>; > else > goto <bb 7>; > > <bb 7>: > return; > > The PHI nodes in bb 6 is what makes if-conversion fail (thus, the > irregular loop entry which really should be peeled off). > > This situation commonly occurs when PRE can compute the first iterations > result. Manually peeling off the iteration like the following is a > workaround: > > void foo2() { > a[0] = 0; > for (int i=1; i!=1024; ++i) { > float z = i; > a[i] = bar(z*s[i],z*c[i]); > } > } > > Not sure if your original issue you derived this testcase from really > matches the above problem though. > > -- > Configure bugmail: http://gcc.gnu.org/bugzilla/userprefs.cgi?tab=email > ------- You are receiving this mail because: ------- > You reported the bug. -- Il est bon de suivre sa pente, pourvu que ce soit en montant. A.G. http://www.flickr.com/photos/vin60/1320965757/