1cb93a386Sopenharmony_ciuniform half4 colorRed, colorGreen;
2cb93a386Sopenharmony_ci
3cb93a386Sopenharmony_cibool test() {
4cb93a386Sopenharmony_ci    const half4 colorWhite = half4(1);
5cb93a386Sopenharmony_ci    const half2 point = half2(40, 60);
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_ci    bool ok = true;
8cb93a386Sopenharmony_ci    // Comparisons on swizzled constants should fold
9cb93a386Sopenharmony_ci    ok = ok && (point.x >= 0 && point.x <= 100 && point.y >= 0 && point.y <= 100);
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci    // Arithmetic on swizzled constants should fold
12cb93a386Sopenharmony_ci    ok = ok && (colorWhite.x == 1);
13cb93a386Sopenharmony_ci    ok = ok && (colorWhite.x + colorWhite.y == 2);
14cb93a386Sopenharmony_ci    ok = ok && (colorWhite.x + colorWhite.y + colorWhite.z == 3);
15cb93a386Sopenharmony_ci    ok = ok && (colorWhite.x + colorWhite.y + colorWhite.z + colorWhite.w == 4);
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ci    // No-op arithmetic using swizzled constants should fold away
18cb93a386Sopenharmony_ci    ok = ok && ((colorGreen * colorWhite.x) != (colorRed * colorWhite.y));
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_ci    // Folding on swizzles with more than one component should be optimized.
21cb93a386Sopenharmony_ci    const half2 pointOffset = point.yx + colorWhite.xz;
22cb93a386Sopenharmony_ci    ok = ok && (pointOffset == half2(61, 41));
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_ci    return ok;
25cb93a386Sopenharmony_ci}
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_cihalf4 main(float2 coords) {
28cb93a386Sopenharmony_ci    return test() ? colorGreen : colorRed;
29cb93a386Sopenharmony_ci}
30