I debugged the pixels (two pixels in the exact same spot in different builds) and found that every single floating value was the same, and that the color only diverged in the image sample.
Here's the assembly for the version without fract (comments show the resulting value)
void main() {
...
int _34 = *fragIndex; //1
int _35 = CopyObject(_34) : [[NonUniform]]; //1
SampledImage<float2D>* _37 = &texSampler[_35] : [[NonUniform]];
SampledImage<float2D> _38 = *_37 : [[NonUniform]];
float2 _40 = *atlasPos; //0.00006, 0.00028
float2 _41 = *fragTexCoord; //0.00249, 0.97737
float2 _43 = *atlasReg; //0.01283, 0.06861
float2 _44 = _41 * _43; //_44 0.00003, 0.06706
float2 _45 = _40 + _44; //_45 0.0001, 0.06734
float4 _46 = ImageSampleImplicitLod(_38, _45); //_46 1.00, 1.00, 1.00, 0.00 <--- Blank alpha, like it's supposed to have
float4 _49 = *fragColor;
float4 _50 = _46 * _49;
*_24 = _50;
...
}
And the version with,
...
int _34 = *fragIndex; // 1
int _35 = CopyObject(_34) : [[NonUniform]]; //1
SampledImage<float2D>* _37 = &texSampler[_35] : [[NonUniform]];
SampledImage<float2D> _38 = *_37 : [[NonUniform]];
float2 _40 = *atlasPos; //_40 0.00006, 0.00028
float2 _41 = *fragTexCoord; //_41 0.00249, 0.97737
float2 _42 = GLSL.std.450::Fract(_41); //_42 0.00249, 0.97737
float2 _44 = *atlasReg; //_44 0.01283, 0.06861
float2 _45 = _42 * _44; //_45 0.00003, 0.06706
float2 _46 = _40 + _45; //_46 0.0001, 0.06734
float4 _47 = ImageSampleImplicitLod(_38, _46); //_47 0.85039, 0.87714, 0.85565, 0.25 <---Color is not blank
float4 _50 = *fragColor;
float4 _51 = _47 * _50;
*_24 = _51;
...
So despite the change being triggered by the call to fract it looks like the change is caused by the Sampled Image, despite it being the exact same image.