
HLSL 202x inherits from C++11, which generates additional loop hint information for loops that must progress. Since HLSL 202x is going to be the default for Clang we want to make sure all our tests pass with it. Required for https://github.com/llvm/llvm-project/issues/108044
137 lines
4.1 KiB
HLSL
137 lines
4.1 KiB
HLSL
// RUN: %clang_cc1 -std=hlsl202x -finclude-default-header -x hlsl -triple \
|
|
// RUN: dxil-pc-shadermodel6.3-library -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s
|
|
|
|
/*** for ***/
|
|
void for_count()
|
|
{
|
|
// CHECK-LABEL: for_count
|
|
[unroll(8)]
|
|
for( int i = 0; i < 1000; ++i);
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_DISTINCT:.*]]
|
|
}
|
|
|
|
void for_disable()
|
|
{
|
|
// CHECK-LABEL: for_disable
|
|
[loop]
|
|
for( int i = 0; i < 1000; ++i);
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_DISABLE:.*]]
|
|
}
|
|
|
|
void for_enable()
|
|
{
|
|
// CHECK-LABEL: for_enable
|
|
[unroll]
|
|
for( int i = 0; i < 1000; ++i);
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_ENABLE:.*]]
|
|
}
|
|
|
|
void for_nested_one_unroll_enable()
|
|
{
|
|
// CHECK-LABEL: for_nested_one_unroll_enable
|
|
int s = 0;
|
|
[unroll]
|
|
for( int i = 0; i < 1000; ++i) {
|
|
for( int j = 0; j < 10; ++j)
|
|
s += i + j;
|
|
}
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_NESTED_ENABLE_INNER:.*]]
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_NESTED_ENABLE_OUTER:.*]]
|
|
}
|
|
|
|
void for_nested_two_unroll_enable()
|
|
{
|
|
// CHECK-LABEL: for_nested_two_unroll_enable
|
|
int s = 0;
|
|
[unroll]
|
|
for( int i = 0; i < 1000; ++i) {
|
|
[unroll]
|
|
for( int j = 0; j < 10; ++j)
|
|
s += i + j;
|
|
}
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_NESTED2_ENABLE:.*]]
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[FOR_NESTED2_1_ENABLE:.*]]
|
|
}
|
|
|
|
|
|
/*** while ***/
|
|
void while_count()
|
|
{
|
|
// CHECK-LABEL: while_count
|
|
int i = 1000;
|
|
[unroll(4)]
|
|
while(i-->0);
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_DISTINCT:.*]]
|
|
}
|
|
|
|
void while_disable()
|
|
{
|
|
// CHECK-LABEL: while_disable
|
|
int i = 1000;
|
|
[loop]
|
|
while(i-->0);
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_DISABLE:.*]]
|
|
}
|
|
|
|
void while_enable()
|
|
{
|
|
// CHECK-LABEL: while_enable
|
|
int i = 1000;
|
|
[unroll]
|
|
while(i-->0);
|
|
// CHECK: br label %{{.*}}, !llvm.loop ![[WHILE_ENABLE:.*]]
|
|
}
|
|
|
|
/*** do ***/
|
|
void do_count()
|
|
{
|
|
// CHECK-LABEL: do_count
|
|
int i = 1000;
|
|
[unroll(16)]
|
|
do {} while(i--> 0);
|
|
// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_DISTINCT:.*]]
|
|
}
|
|
|
|
void do_disable()
|
|
{
|
|
// CHECK-LABEL: do_disable
|
|
int i = 1000;
|
|
[loop]
|
|
do {} while(i--> 0);
|
|
// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_DISABLE:.*]]
|
|
}
|
|
|
|
void do_enable()
|
|
{
|
|
// CHECK-LABEL: do_enable
|
|
int i = 1000;
|
|
[unroll]
|
|
do {} while(i--> 0);
|
|
// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !llvm.loop ![[DO_ENABLE:.*]]
|
|
}
|
|
|
|
|
|
// CHECK-DAG: [[MUST_PROGRESS:.*]] = !{!"llvm.loop.mustprogress"}
|
|
// CHECK-DAG: [[DISABLE:.*]] = !{!"llvm.loop.unroll.disable"}
|
|
// CHECK-DAG: [[FOR_COUNT:.*]] = !{!"llvm.loop.unroll.count", i32 8}
|
|
// CHECK-DAG: [[ENABLE:.*]] = !{!"llvm.loop.unroll.enable"}
|
|
// CHECK-DAG: [[WHILE_COUNT:.*]] = !{!"llvm.loop.unroll.count", i32 4}
|
|
// CHECK-DAG: [[DO_COUNT:.*]] = !{!"llvm.loop.unroll.count", i32 16}
|
|
|
|
// CHECK-DAG: ![[FOR_DISTINCT]] = distinct !{![[FOR_DISTINCT]], [[MUST_PROGRESS]], [[FOR_COUNT]]}
|
|
// CHECK-DAG: ![[FOR_DISABLE]] = distinct !{![[FOR_DISABLE]], [[MUST_PROGRESS]], [[DISABLE]]}
|
|
// CHECK-DAG: ![[FOR_ENABLE]] = distinct !{![[FOR_ENABLE]], [[MUST_PROGRESS]], [[ENABLE]]}
|
|
|
|
// CHECK-DAG: ![[FOR_NESTED_ENABLE_INNER]] = distinct !{![[FOR_NESTED_ENABLE_INNER]], [[MUST_PROGRESS]]}
|
|
// CHECK-DAG: ![[FOR_NESTED_ENABLE_OUTER]] = distinct !{![[FOR_NESTED_ENABLE_OUTER]], [[MUST_PROGRESS]], [[ENABLE]]}
|
|
// CHECK-DAG: ![[FOR_NESTED2_ENABLE]] = distinct !{![[FOR_NESTED2_ENABLE]], [[MUST_PROGRESS]], [[ENABLE]]}
|
|
// CHECK-DAG: ![[FOR_NESTED2_1_ENABLE]] = distinct !{![[FOR_NESTED2_1_ENABLE]], [[MUST_PROGRESS]], [[ENABLE]]}
|
|
// CHECK-DAG: ![[WHILE_DISTINCT]] = distinct !{![[WHILE_DISTINCT]], [[MUST_PROGRESS]], [[WHILE_COUNT]]}
|
|
|
|
// CHECK-DAG: ![[WHILE_DISABLE]] = distinct !{![[WHILE_DISABLE]], [[MUST_PROGRESS]], [[DISABLE]]}
|
|
// CHECK-DAG: ![[WHILE_ENABLE]] = distinct !{![[WHILE_ENABLE]], [[MUST_PROGRESS]], [[ENABLE]]}
|
|
// CHECK-DAG: ![[DO_DISTINCT]] = distinct !{![[DO_DISTINCT]], [[MUST_PROGRESS]], [[DO_COUNT]]}
|
|
|
|
// CHECK-DAG: ![[DO_DISABLE]] = distinct !{![[DO_DISABLE]], [[MUST_PROGRESS]], [[DISABLE]]}
|
|
// CHECK-DAG: ![[DO_ENABLE]] = distinct !{![[DO_ENABLE]], [[MUST_PROGRESS]], [[ENABLE]]}
|