SKIP: FAILED

static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
cbuffer cbuffer_x_6 : register(b0, space0) {
  uint4 x_6[1];
};
static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);

void main_1() {
  [loop] while (true) {
    bool x_45 = false;
    int x_48 = 0;
    int x_49 = 0;
    bool x_46 = false;
    int x_115 = 0;
    int x_116 = 0;
    bool x_45_phi = false;
    int x_48_phi = 0;
    int x_50_phi = 0;
    int x_52_phi = 0;
    int x_111_phi = 0;
    bool x_112_phi = false;
    int x_115_phi = 0;
    int x_118_phi = 0;
    int x_120_phi = 0;
    int x_161_phi = 0;
    const float x_40 = asfloat(x_6[0].x);
    const bool x_41 = (x_40 < -1.0f);
    x_45_phi = false;
    x_48_phi = 0;
    x_50_phi = 0;
    x_52_phi = 0;
    [loop] while (true) {
      int x_62 = 0;
      int x_65 = 0;
      int x_66 = 0;
      int x_63 = 0;
      int x_53 = 0;
      int x_62_phi = 0;
      int x_65_phi = 0;
      int x_67_phi = 0;
      int x_51_phi = 0;
      int x_49_phi = 0;
      bool x_46_phi = false;
      x_45 = x_45_phi;
      x_48 = x_48_phi;
      const int x_50 = x_50_phi;
      const int x_52 = x_52_phi;
      const float x_55 = gl_FragCoord.y;
      x_111_phi = x_48;
      x_112_phi = x_45;
      if ((x_52 < ((x_55 > -1.0f) ? 10 : 100))) {
      } else {
        break;
      }
      x_62_phi = x_48;
      x_65_phi = x_50;
      x_67_phi = 0;
      [loop] while (true) {
        int x_97 = 0;
        int x_68 = 0;
        int x_66_phi = 0;
        x_62 = x_62_phi;
        x_65 = x_65_phi;
        const int x_67 = x_67_phi;
        x_51_phi = x_65;
        x_49_phi = x_62;
        x_46_phi = x_45;
        if ((x_67 < 2)) {
        } else {
          break;
        }
        [loop] while (true) {
          bool x_78 = false;
          int x_86_phi = 0;
          int x_97_phi = 0;
          bool x_98_phi = false;
          const float x_77 = gl_FragCoord.x;
          x_78 = (x_77 < -1.0f);
          if (!((x_40 < 0.0f))) {
            if (x_78) {
              x_66_phi = 0;
              break;
            }
            x_86_phi = 1;
            [loop] while (true) {
              int x_87 = 0;
              const int x_86 = x_86_phi;
              x_97_phi = x_65;
              x_98_phi = false;
              if ((x_86 < 3)) {
              } else {
                break;
              }
              if (x_78) {
                {
                  x_87 = (x_86 + 1);
                  x_86_phi = x_87;
                }
                continue;
              }
              if ((x_86 > 0)) {
                x_97_phi = 1;
                x_98_phi = true;
                break;
              }
              {
                x_87 = (x_86 + 1);
                x_86_phi = x_87;
              }
            }
            x_97 = x_97_phi;
            const bool x_98 = x_98_phi;
            x_66_phi = x_97;
            if (x_98) {
              break;
            }
          }
          x_66_phi = 0;
          break;
        }
        x_66 = x_66_phi;
        x_63 = asint((x_62 + x_66));
        if (x_41) {
          [loop] while (true) {
            if (x_41) {
            } else {
              break;
            }
            {
              const float x_105 = float(x_52);
              x_GLF_color = float4(x_105, x_105, x_105, x_105);
            }
          }
          x_51_phi = x_66;
          x_49_phi = x_63;
          x_46_phi = true;
          break;
        }
        {
          x_68 = (x_67 + 1);
          x_62_phi = x_63;
          x_65_phi = x_66;
          x_67_phi = x_68;
        }
      }
      const int x_51 = x_51_phi;
      x_49 = x_49_phi;
      x_46 = x_46_phi;
      x_111_phi = x_49;
      x_112_phi = x_46;
      if (x_46) {
        break;
      }
      if (!(x_41)) {
        x_111_phi = x_49;
        x_112_phi = x_46;
        break;
      }
      {
        x_53 = (x_52 + 1);
        x_45_phi = x_46;
        x_48_phi = x_49;
        x_50_phi = x_51;
        x_52_phi = x_53;
      }
    }
    const int x_111 = x_111_phi;
    if (x_112_phi) {
      break;
    }
    x_115_phi = x_111;
    x_118_phi = 0;
    x_120_phi = 0;
    [loop] while (true) {
      int x_154 = 0;
      int x_121 = 0;
      int x_119_phi = 0;
      x_115 = x_115_phi;
      const int x_118 = x_118_phi;
      const int x_120 = x_120_phi;
      const float x_123 = asfloat(x_6[0].y);
      x_161_phi = x_115;
      if ((x_120 < int((x_123 + 1.0f)))) {
      } else {
        break;
      }
      [loop] while (true) {
        bool x_135 = false;
        int x_143_phi = 0;
        int x_154_phi = 0;
        bool x_155_phi = false;
        const float x_134 = gl_FragCoord.x;
        x_135 = (x_134 < -1.0f);
        if (!((x_40 < 0.0f))) {
          if (x_135) {
            x_119_phi = 0;
            break;
          }
          x_143_phi = 1;
          [loop] while (true) {
            int x_144 = 0;
            const int x_143 = x_143_phi;
            x_154_phi = x_118;
            x_155_phi = false;
            if ((x_143 < 3)) {
            } else {
              break;
            }
            if (x_135) {
              {
                x_144 = (x_143 + 1);
                x_143_phi = x_144;
              }
              continue;
            }
            if ((x_143 > 0)) {
              x_154_phi = 1;
              x_155_phi = true;
              break;
            }
            {
              x_144 = (x_143 + 1);
              x_143_phi = x_144;
            }
          }
          x_154 = x_154_phi;
          const bool x_155 = x_155_phi;
          x_119_phi = x_154;
          if (x_155) {
            break;
          }
        }
        x_119_phi = 0;
        break;
      }
      int x_119 = 0;
      x_119 = x_119_phi;
      x_116 = asint((x_115 + x_119));
      if ((!(x_41) ? false : x_41)) {
        x_161_phi = x_116;
        break;
      }
      {
        x_121 = (x_120 + 1);
        x_115_phi = x_116;
        x_118_phi = x_119;
        x_120_phi = x_121;
      }
    }
    if ((x_161_phi == 4)) {
      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
    } else {
      x_GLF_color = (0.0f).xxxx;
    }
    break;
  }
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 gl_FragCoord_param : SV_Position;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 : SV_Target0;
};

main_out main_inner(float4 gl_FragCoord_param) {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  const main_out tint_symbol_4 = {x_GLF_color};
  return tint_symbol_4;
}

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}
FXC validation failure:
C:\src\dawn\test\tint\Shader@0x000001E775162FA0(8,10-21): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
C:\src\dawn\test\tint\Shader@0x000001E775162FA0(71,16-27): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
C:\src\dawn\test\tint\Shader@0x000001E775162FA0(186,14-25): warning X3557: loop only executes for 0 iteration(s), consider removing [loop]
C:\src\dawn\test\tint\Shader@0x000001E775162FA0(123,18-29): error X4029: infinite loop detected - loop never exits

