llvm/clang/test/CodeGenHLSL/convergence/cf.for.plain.hlsl

// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \
// RUN:   spirv-pc-vulkan-library %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s

int process() {
// CHECK: entry:
// CHECK:   %[[#entry_token:]] = call token @llvm.experimental.convergence.entry()
  int val = 0;

// CHECK: for.cond:
// CHECK-NEXT:   %[[#]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %[[#entry_token]]) ]
// CHECK: br i1 {{.*}}, label %for.body, label %for.end
  for (int i = 0; i < 10; ++i) {

// CHECK: for.body:
// CHECK:   br label %for.inc
    val = i;

// CHECK: for.inc:
// CHECK:   br label %for.cond
  }

// CHECK: for.end:
// CHECK:   br label %for.cond1

  // Infinite loop
  for ( ; ; ) {
// CHECK: for.cond1:
// CHECK-NEXT:   %[[#]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %[[#entry_token]]) ]
// CHECK:   br label %for.cond1
    val = 0;
  }

// CHECK-NEXT: }
// This loop in unreachable. Not generated.
  // Null body
  for (int j = 0; j < 10; ++j)
  ;
  return val;
}

[numthreads(1, 1, 1)]
void main() {
  process();
}