GE8100 in HTC Desire 12 (Android 7.1.1): fragment shader fails to compile

Another shader that works on Adreno and Mali but fails to compile on GE8100 with the very same cryptic ‘Compile failed’.

Vertex shader: identical like last time

Fragment shader:

#version 310 es
precision highp float;
precision highp int;

out vec4 fragColor;           // The output color
in vec2 v_TexCoordinate;      // Interpolated texture coordinate per fragment.
in vec2 v_Pixel;              // location of the current fragment, in pixels

//////////////////////////////////////////////////////////////////////////////////////////////
// per-pixel linked list. Order Independent Transparency.

uniform uvec2 u_Size;

layout (std430,binding=1) buffer linkedlist  // first (u_Size.x*u_Size.y) uints - head pointers,
  {                                          // one for each pixel in the Output rectangle.
  uint u_Records[];                          //
  };                                         // Next 3*u_numRecords uints - actual linked list, i.e.
                                             // triplets of (pointer,depth,rgba).

//////////////////////////////////////////////////////////////////////////////////////////////

vec4 convert(uint rgba)
  {
  return vec4( float((rgba>>24u)&255u),float((rgba>>16u)&255u),float((rgba>>8u)&255u),float(rgba&255u) ) / 255.0;
  }

//////////////////////////////////////////////////////////////////////////////////////////////
// A over B (https://en.wikipedia.org/wiki/Alpha_compositing)


vec4 blend(vec4 A,vec4 B)
  {
  float b = B.a * (1.0-A.a);
  float a = A.a + b;

  return vec4( (A.rgb*A.a + B.rgb*b)/a , a );
  }

//////////////////////////////////////////////////////////////////////////////////////////////
// Pass4 of the OIT algorithm - keep traversing the linked list, build the final color and blend it.

void main()                    		
  {
  uint prev = uint(v_Pixel.x) + uint(v_Pixel.y) * u_Size.x;
  uint curr = u_Records[prev];

  if (curr != 0u)
    {
    const float S= 2147483647.0;
    gl_FragDepth = 1.0 - 2.0*float(u_Records[curr+1u])/S;
    vec4 color   = convert(u_Records[curr+2u]);
    curr = u_Records[curr];

    while (curr != 0u)
      {
      color = blend( color , convert(u_Records[curr+2u]) );
      curr = u_Records[curr];
      }

    fragColor = color;
    }
  else discard;
}