xref: /llvm-project/clang/test/CodeGenHLSL/HLSLControlFlowHint.hlsl (revision 380bb51b70b6d9f3da07a87f56fc3fe44bc78691)
1// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -o - | FileCheck %s
2// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-vulkan-library %s -fnative-half-type -emit-llvm -o - | FileCheck %s
3
4// CHECK: define {{.*}} i32 {{.*}}test_branch{{.*}}(i32 {{.*}} [[VALD:%.*]])
5// CHECK: [[PARAM:%.*]] = load i32, ptr [[VALD]].addr, align 4
6// CHECK: [[CMP:%.*]] = icmp sgt i32 [[PARAM]], 0
7// CHECK: br i1 [[CMP]], label %if.then, label %if.else, !hlsl.controlflow.hint [[HINT_BRANCH:![0-9]+]]
8export int test_branch(int X){
9    int resp;
10    [branch] if (X > 0) {
11        resp = -X;
12    } else {
13        resp = X * 2;
14    }
15
16    return resp;
17}
18
19// CHECK: define {{.*}} i32 {{.*}}test_flatten{{.*}}(i32 {{.*}} [[VALD:%.*]])
20// CHECK: [[PARAM:%.*]] = load i32, ptr [[VALD]].addr, align 4
21// CHECK: [[CMP:%.*]] = icmp sgt i32 [[PARAM]], 0
22// CHECK: br i1 [[CMP]], label %if.then, label %if.else, !hlsl.controlflow.hint [[HINT_FLATTEN:![0-9]+]]
23export int test_flatten(int X){
24    int resp;
25    [flatten] if (X > 0) {
26        resp = -X;
27    } else {
28        resp = X * 2;
29    }
30
31    return resp;
32}
33
34// CHECK: define {{.*}} i32 {{.*}}test_no_attr{{.*}}(i32 {{.*}} [[VALD:%.*]])
35// CHECK-NOT: !hlsl.controlflow.hint
36export int test_no_attr(int X){
37    int resp;
38    if (X > 0) {
39        resp = -X;
40    } else {
41        resp = X * 2;
42    }
43
44    return resp;
45}
46
47//CHECK: [[HINT_BRANCH]] = !{!"hlsl.controlflow.hint", i32 1}
48//CHECK: [[HINT_FLATTEN]] = !{!"hlsl.controlflow.hint", i32 2}
49