// RUN: %dxc -T ps_6_0 -E main

void main() {
// CHECK-LABEL: %bb_entry = OpLabel
    int val = 0;

// CHECK:      OpStore %val %int_0
// CHECK-NEXT: OpStore %i %int_0
// CHECK-NEXT: OpBranch %for_check

// CHECK-LABEL: %for_check = OpLabel
// CHECK-NEXT: [[i0:%\d+]] = OpLoad %int %i
// CHECK-NEXT: [[lt0:%\d+]] = OpSLessThan %bool [[i0]] %int_10
// CHECK-NEXT: OpLoopMerge %for_merge_1 %for_continue_1 Unroll
// CHECK-NEXT: OpBranchConditional [[lt0]] %for_body %for_merge_1
    [unroll] for (int i = 0; i < 10; ++i) {
// CHECK-LABEL: %for_body = OpLabel
// CHECK-NEXT: [[val0:%\d+]] = OpLoad %int %val
// CHECK-NEXT: [[i1:%\d+]] = OpLoad %int %i
// CHECK-NEXT: [[add0:%\d+]] = OpIAdd %int [[val0]] [[i1]]
// CHECK-NEXT: OpStore %val [[add0]]
        val = val + i;
// CHECK-NEXT: OpStore %j %int_0
// CHECK-NEXT: OpBranch %for_check_0

// CHECK-LABEL: %for_check_0 = OpLabel
// CHECK-NEXT: [[j0:%\d+]] = OpLoad %int %j
// CHECK-NEXT: [[lt1:%\d+]] = OpSLessThan %bool [[j0]] %int_10
// CHECK-NEXT: OpLoopMerge %for_merge_0 %for_continue_0 DontUnroll
// CHECK-NEXT: OpBranchConditional [[lt1]] %for_body_0 %for_merge_0
        [loop] for (int j = 0; j < 10; ++j) {
// CHECK-LABEL: %for_body_0 = OpLabel
// CHECK-NEXT: OpStore %k %int_0
// CHECK-NEXT: OpBranch %for_check_1

// CHECK-LABEL: %for_check_1 = OpLabel
// CHECK-NEXT: [[k0:%\d+]] = OpLoad %int %k
// CHECK-NEXT: [[lt2:%\d+]] = OpSLessThan %bool [[k0]] %int_10
// CHECK-NEXT: OpLoopMerge %for_merge %for_continue DontUnroll
// CHECK-NEXT: OpBranchConditional [[lt2]] %for_body_1 %for_merge
            [fastopt] for (int k = 0; k < 10; ++k) {
// CHECK-LABEL: %for_body_1 = OpLabel
// CHECK-NEXT: [[val1:%\d+]] = OpLoad %int %val
// CHECK-NEXT: [[k1:%\d+]] = OpLoad %int %k
// CHECK-NEXT: [[add1:%\d+]] = OpIAdd %int [[val1]] [[k1]]
// CHECK-NEXT: OpStore %val [[add1]]
// CHECK-NEXT: OpBranch %for_continue
                val = val + k;

// CHECK-LABEL: %for_continue = OpLabel
// CHECK-NEXT: [[k2:%\d+]] = OpLoad %int %k
// CHECK-NEXT: [[add2:%\d+]] = OpIAdd %int [[k2]] %int_1
// CHECK-NEXT: OpStore %k [[add2]]
// CHECK-NEXT: OpBranch %for_check_1
            }

// CHECK-LABEL: %for_merge = OpLabel
// CHECK-NEXT: [[val2:%\d+]] = OpLoad %int %val
// CHECK-NEXT: [[mul0:%\d+]] = OpIMul %int [[val2]] %int_2
// CHECK-NEXT: OpStore %val [[mul0]]
// CHECK-NEXT: OpBranch %for_continue_0
            val = val * 2;

// CHECK-LABEL: %for_continue_0 = OpLabel
// CHECK-NEXT: [[j1:%\d+]] = OpLoad %int %j
// CHECK-NEXT: [[add3:%\d+]] = OpIAdd %int [[j1]] %int_1
// CHECK-NEXT: OpStore %j [[add3]]
// CHECK-NEXT: OpBranch %for_check_0
        }
// CHECK-LABEL: %for_merge_0 = OpLabel
// CHECK-NEXT: OpBranch %for_continue_1

// CHECK-LABEL: %for_continue_1 = OpLabel
// CHECK-NEXT: [[i2:%\d+]] = OpLoad %int %i
// CHECK-NEXT: [[add4:%\d+]] = OpIAdd %int [[i2]] %int_1
// CHECK-NEXT: OpStore %i [[add4]]
// CHECK-NEXT: OpBranch %for_check
    }

// CHECK-LABEL: %for_merge_1 = OpLabel
// CHECK-NEXT: OpReturn
}
