Hi Hui Shi, Thanks for the clarification. Your change looks good to me then.
-Mei ________________________________ From: Hui Shi [mailto:kalin....@gmail.com] Sent: Wednesday, August 18, 2010 8:04 PM To: Ye, Mei Cc: Sun Chan; open64-devel@lists.sourceforge.net Subject: Re: [Open64-devel] Simd_Finalize_Loops bug in handling unsigned comparison loop end Hi Mei, If both start and end is 0, it will not enter this loop, because do loop guard ( if ( start < end ) ) is already added for this loop in STD_Canonicalize_Upper_Bound. In following loop transformation, can trunst change of i < end to i <= end -1 is always legal and correct. But such do loop guard can't guarantee orig SIMD loop end update is correct. 2010/8/19 Ye, Mei <mei...@amd.com<mailto:mei...@amd.com>> Hello Hui Shi See attached "simd.cxx", search for "!!!!!!!". In your example, if start = 0, end = 0, can a change of "i < end" to " i <= end - 1" make a 0-trip-count loop to 0xffffffff-trip-count loop? If this is the case, the formular for simd loop-end should be revised since the existing one assumes that all LT comparisons have been changed to LE comparisions. -Mei ________________________________ From: Hui Shi [mailto:kalin....@gmail.com<mailto:kalin....@gmail.com>] Sent: Tuesday, August 17, 2010 7:15 PM To: Ye, Mei Cc: Sun Chan; open64-devel@lists.sourceforge.net<mailto:open64-devel@lists.sourceforge.net> Subject: Re: [Open64-devel] Simd_Finalize_Loops bug in handling unsigned comparison loop end Hi Mei, I made fix for both place. In patch file. @@ -4848,6 +4848,23 @@ is for the then branch and @@ -4936,6 +4959,11 @@ is for the else branch. I only add comment in first place. 2010/8/18 Ye, Mei <mei...@amd.com<mailto:mei...@amd.com>> Sorry for the late reply. Somehow did not see your Email. I mean, if (WN_kid0(loop_end) == tmp) { if (opr == OPR_LT) { .... --- you fixed here } ... } else { if (opr == OPR_LT) { ..... --- looks like you miss here. } ...... } ________________________________ From: Hui Shi [mailto:kalin....@gmail.com<mailto:kalin....@gmail.com>] Sent: Friday, August 13, 2010 9:29 PM To: Ye, Mei; Sun Chan Cc: open64-devel@lists.sourceforge.net<mailto:open64-devel@lists.sourceforge.net> Subject: Re: [Open64-devel] Simd_Finalize_Loops bug in handling unsigned comparison loop end Hi, Mei I fix loop's end update in both branch. Do you mean I miss fixing for the remainder loop's tart? remainder_start = start + (((end-start) + 1)/vect)*vect, because end>=start has the do loop guard, I guess the start value is always correct. 2010/8/12 Sun Chan <sun.c...@gmail.com<mailto:sun.c...@gmail.com>> if the fix need to be in multiple places, perhaps make a template out of that? Sun On Thu, Aug 12, 2010 at 9:27 AM, Ye, Mei <mei...@amd.com<mailto:mei...@amd.com>> wrote: > Hello Kalin, > > > > Looks like you missed another place in Simd_Finalize_Loops that may require > a similar fix. > > > > -Mei > > > > ________________________________ > > From: Ju, Roy > Sent: Wednesday, August 11, 2010 3:11 PM > To: Ye, Mei > Subject: FW: [Open64-devel] Simd_Finalize_Loops bug in handling unsigned > comparison loop end > > > > Mei, > > See if you can review this changelist. Thanks. > > > > Roy > > > > From: Hui Shi [mailto:] > Sent: Sunday, August 08, 2010 7:46 PM > To: > Subject: [Open64-devel] Simd_Finalize_Loops bug in handling unsigned > comparison loop end > > > > Hi, All > > > > Can LNO gatekeeper help review this fix? > > > > This bug happens in -m32 on x8664 linux. > > Attached is the test case and patch. > > command line is > > opencc -O3 unsigned_loop_end.c -INLINE:ne=foo:ne=init:ne=check > -OPT:unroll_times_max=1 -m32 > > > > The bug happens when vectorization is happend on following loop. > > int a[100] > > int start; > unsigned i, end; > for( i = start; i < end; i++) { > a[i] = a[i+1]; > } > > with -m64 unsigned comparison is transformed to signed comparison in > STD_Canonicalize_Upper_Bound. > > with -m32 unsigned comparison is kept in LNO. > > > > will update loop_end align to vecotrize factor (vect) > > i <= start + (((end - start + 1) / vect) * vect) -1 > suppose start is 0, end is 2, vect is 4, original serial loop is > for( i = 0; i < 2; i++) > after Simd_Finalize_Loops transformation, simd loop becomes > for(i = 0, i <= -1; i++), > > This loop will itreate 0xffffffff times. > > > > The fix is change loop end to following form when compraion is unsigned. > i < start + (((end - start + 1) / vect) * vect) > > > > > > As discussed with Shuxin, we also doubt why SIMD loop's upper need aligned > with vecotrized factor. Can SIMD only update loop's step? > > like for(i = start, i <= end-1; i+= vector_factor)? > > > > > > Best Regards > > Shi, Hui > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by > > Make an app they can't live without > Enter the BlackBerry Developer Challenge > http://p.sf.net/sfu/RIM-dev2dev > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net<mailto:Open64-devel@lists.sourceforge.net> > https://lists.sourceforge.net/lists/listinfo/open64-devel > >
------------------------------------------------------------------------------ This SF.net email is sponsored by Make an app they can't live without Enter the BlackBerry Developer Challenge http://p.sf.net/sfu/RIM-dev2dev
_______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel