https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119325
--- Comment #14 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Richard Biener from comment #13) > (In reply to Tobias Burnus from comment #12) > > BTW, I added some diagnostic to the 'if' clause showing: > > > > v64sf_fmod.c:147:109: warning: ‘__from’ (‘v2sf’ {aka ‘__vector(2) float’}): > > size = 8, align = 64 > > v64sf_fmod.c:147:198: warning: ‘__from’ (‘v2sf’ {aka ‘__vector(2) float’}): > > size = 8, align = 64 > > v64sf_fmod.c:147:3730: warning: ‘__from’ (‘v4sf’ {aka ‘__vector(4) float’}): > > size = 16, align = 128 > > v64sf_fmod.c:147:3819: warning: ‘__from’ (‘v4sf’ {aka ‘__vector(4) float’}): > > size = 16, align = 128 > > v64sf_fmod.c:147:7351: warning: ‘__from’ (‘v8sf’ {aka ‘__vector(8) float’}): > > size = 32, align = 256 > > v64sf_fmod.c:147:7440: warning: ‘__from’ (‘v8sf’ {aka ‘__vector(8) float’}): > > size = 32, align = 256 > > v64sf_fmod.c:147:10976: warning: ‘__from’ (‘v16sf’ {aka ‘__vector(16) > > float’}): size = 64, align = 512 > > v64sf_fmod.c:147:11065: warning: ‘__from’ (‘v16sf’ {aka ‘__vector(16) > > float’}): size = 64, align = 512 > > v64sf_fmod.c:147:14627: warning: ‘__from’ (‘v32sf’ {aka ‘__vector(32) > > float’}): size = 128, align = 1024 > > v64sf_fmod.c:147:14716: warning: ‘__from’ (‘v32sf’ {aka ‘__vector(32) > > float’}): size = 128, align = 1024 > > 147 | DEF_VARIANTS2 (fmodf, sf, sf) > > > > That's for the expansion of RESIZE_VECTOR: > > > > amdgcn_veclib.h:89:3: warning: ‘__from’ (‘v2sf’ {aka ‘__vector(2) float’}): > > size = 8, align = 64 > > 89 | *((to_t *) &__from); \ > > | ^~~~~~~~~~~~~~~~~~~ > > > > i.e. > > > > 84 /* Cast between vectors with a different number of elements. */ > > 85 > > 86 #define RESIZE_VECTOR(to_t, from) \ > > 87 ({ \ > > 88 __auto_type __from = (from); \ > > 89 *((to_t *) &__from); \ > > 90 }) > > The if-condition should only trigger if the access (which might be a > sub-access) > is completely out of bounds of the target. Say, if for weird reason > the above has to_t bigger than __from, and thus if we'd for some reason > split the access have the "upper part" be outside of __from. > > What's 'offset' in these cases? So indeed I see for example MEM[(v64sf *)&__from] and __from is v2sf. That's UB. You need to do this differently.