| // 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]]} |