259 lines · plain
1; RUN: llc -mtriple=spirv-unknown-vulkan-compute -O0 -verify-machineinstrs %s -o - | FileCheck %s2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan-compute %s -o - -filetype=obj | spirv-val %}3 4; CHECK-DAG: OpName %[[#For:]] "for_loop"5; CHECK-DAG: OpName %[[#While:]] "while_loop"6; CHECK-DAG: OpName %[[#DoWhile:]] "do_while_loop"7; CHECK-DAG: OpName %[[#Disable:]] "unroll_disable"8; CHECK-DAG: OpName %[[#Count:]] "unroll_count"9; CHECK-DAG: OpName %[[#Full:]] "unroll_full"10; CHECK-DAG: OpName %[[#FullCount:]] "unroll_full_count"11; CHECK-DAG: OpName %[[#EnableDisable:]] "unroll_enable_disable"12 13; CHECK: %[[#For]] = OpFunction14; CHECK: OpLoopMerge %[[#]] %[[#]] Unroll15 16; CHECK: %[[#While]] = OpFunction17; CHECK: OpLoopMerge %[[#]] %[[#]] Unroll18 19; CHECK: %[[#DoWhile]] = OpFunction20; CHECK: OpLoopMerge %[[#]] %[[#]] Unroll21 22; CHECK: %[[#Disable]] = OpFunction23; CHECK: OpLoopMerge %[[#]] %[[#]] DontUnroll24 25; CHECK: %[[#Count]] = OpFunction26; CHECK: OpLoopMerge %[[#]] %[[#]] PartialCount 427 28; CHECK: %[[#Full]] = OpFunction29; CHECK: OpLoopMerge %[[#]] %[[#]] Unroll30 31; CHECK: %[[#FullCount]] = OpFunction32; CHECK: OpLoopMerge %[[#]] %[[#]] Unroll|PartialCount 433 34; CHECK: %[[#EnableDisable]] = OpFunction35; CHECK: OpLoopMerge %[[#]] %[[#]] DontUnroll36; CHECK-NOT: Unroll|DontUnroll37; CHECK-NOT: DontUnroll|Unroll38 39define dso_local void @for_loop(ptr noundef %0, i32 noundef %1) {40 %3 = alloca ptr, align 841 %4 = alloca i32, align 442 %5 = alloca i32, align 443 store ptr %0, ptr %3, align 844 store i32 %1, ptr %4, align 445 store i32 0, ptr %5, align 446 br label %647 486: ; preds = %15, %249 %7 = load i32, ptr %5, align 450 %8 = load i32, ptr %4, align 451 %9 = icmp slt i32 %7, %852 br i1 %9, label %10, label %1853 5410: ; preds = %655 %11 = load i32, ptr %5, align 456 %12 = load ptr, ptr %3, align 857 %13 = load i32, ptr %12, align 458 %14 = add nsw i32 %13, %1159 store i32 %14, ptr %12, align 460 br label %1561 6215: ; preds = %1063 %16 = load i32, ptr %5, align 464 %17 = add nsw i32 %16, 165 store i32 %17, ptr %5, align 466 br label %6, !llvm.loop !167 6818: ; preds = %669 ret void70}71 72define dso_local void @while_loop(ptr noundef %0, i32 noundef %1) {73 %3 = alloca ptr, align 874 %4 = alloca i32, align 475 %5 = alloca i32, align 476 store ptr %0, ptr %3, align 877 store i32 %1, ptr %4, align 478 store i32 0, ptr %5, align 479 br label %680 816: ; preds = %10, %282 %7 = load i32, ptr %5, align 483 %8 = load i32, ptr %4, align 484 %9 = icmp slt i32 %7, %885 br i1 %9, label %10, label %1786 8710: ; preds = %688 %11 = load i32, ptr %5, align 489 %12 = load ptr, ptr %3, align 890 %13 = load i32, ptr %12, align 491 %14 = add nsw i32 %13, %1192 store i32 %14, ptr %12, align 493 %15 = load i32, ptr %5, align 494 %16 = add nsw i32 %15, 195 store i32 %16, ptr %5, align 496 br label %6, !llvm.loop !397 9817: ; preds = %699 ret void100}101 102define dso_local void @do_while_loop(ptr noundef %0, i32 noundef %1) {103 %3 = alloca ptr, align 8104 %4 = alloca i32, align 4105 %5 = alloca i32, align 4106 store ptr %0, ptr %3, align 8107 store i32 %1, ptr %4, align 4108 store i32 0, ptr %5, align 4109 br label %6110 1116: ; preds = %13, %2112 %7 = load i32, ptr %5, align 4113 %8 = load ptr, ptr %3, align 8114 %9 = load i32, ptr %8, align 4115 %10 = add nsw i32 %9, %7116 store i32 %10, ptr %8, align 4117 %11 = load i32, ptr %5, align 4118 %12 = add nsw i32 %11, 1119 store i32 %12, ptr %5, align 4120 br label %13121 12213: ; preds = %6123 %14 = load i32, ptr %5, align 4124 %15 = load i32, ptr %4, align 4125 %16 = icmp slt i32 %14, %15126 br i1 %16, label %6, label %17, !llvm.loop !4127 12817: ; preds = %13129 ret void130}131 132define dso_local void @unroll_disable(i32 noundef %0) {133 %2 = alloca i32, align 4134 %3 = alloca i32, align 4135 store i32 %0, ptr %2, align 4136 store i32 0, ptr %3, align 4137 br label %4138 1394: ; preds = %7, %1140 %5 = load i32, ptr %3, align 4141 %6 = add nsw i32 %5, 1142 store i32 %6, ptr %3, align 4143 br label %7144 1457: ; preds = %4146 %8 = load i32, ptr %3, align 4147 %9 = load i32, ptr %2, align 4148 %10 = icmp slt i32 %8, %9149 br i1 %10, label %4, label %11, !llvm.loop !5150 15111: ; preds = %7152 ret void153}154 155define dso_local void @unroll_count(i32 noundef %0) {156 %2 = alloca i32, align 4157 %3 = alloca i32, align 4158 store i32 %0, ptr %2, align 4159 store i32 0, ptr %3, align 4160 br label %4161 1624: ; preds = %7, %1163 %5 = load i32, ptr %3, align 4164 %6 = add nsw i32 %5, 1165 store i32 %6, ptr %3, align 4166 br label %7167 1687: ; preds = %4169 %8 = load i32, ptr %3, align 4170 %9 = load i32, ptr %2, align 4171 %10 = icmp slt i32 %8, %9172 br i1 %10, label %4, label %11, !llvm.loop !7173 17411: ; preds = %7175 ret void176}177 178define dso_local void @unroll_full(i32 noundef %0) {179 %2 = alloca i32, align 4180 %3 = alloca i32, align 4181 store i32 %0, ptr %2, align 4182 store i32 0, ptr %3, align 4183 br label %4184 1854: ; preds = %7, %1186 %5 = load i32, ptr %3, align 4187 %6 = add nsw i32 %5, 1188 store i32 %6, ptr %3, align 4189 br label %7190 1917: ; preds = %4192 %8 = load i32, ptr %3, align 4193 %9 = load i32, ptr %2, align 4194 %10 = icmp slt i32 %8, %9195 br i1 %10, label %4, label %11, !llvm.loop !9196 19711: ; preds = %7198 ret void199}200 201define dso_local void @unroll_full_count(i32 noundef %0) {202 %2 = alloca i32, align 4203 %3 = alloca i32, align 4204 store i32 %0, ptr %2, align 4205 store i32 0, ptr %3, align 4206 br label %4207 2084: ; preds = %7, %1209 %5 = load i32, ptr %3, align 4210 %6 = add nsw i32 %5, 1211 store i32 %6, ptr %3, align 4212 br label %7213 2147: ; preds = %4215 %8 = load i32, ptr %3, align 4216 %9 = load i32, ptr %2, align 4217 %10 = icmp slt i32 %8, %9218 br i1 %10, label %4, label %11, !llvm.loop !11219 22011: ; preds = %7221 ret void222}223 224define dso_local void @unroll_enable_disable(i32 noundef %0) {225 %2 = alloca i32, align 4226 %3 = alloca i32, align 4227 store i32 %0, ptr %2, align 4228 store i32 0, ptr %3, align 4229 br label %4230 2314: ; preds = %7, %1232 %5 = load i32, ptr %3, align 4233 %6 = add nsw i32 %5, 1234 store i32 %6, ptr %3, align 4235 br label %7236 2377: ; preds = %4238 %8 = load i32, ptr %3, align 4239 %9 = load i32, ptr %2, align 4240 %10 = icmp slt i32 %8, %9241 br i1 %10, label %4, label %11, !llvm.loop !12242 24311: ; preds = %7244 ret void245}246 247!1 = distinct !{!1, !2}248!2 = !{!"llvm.loop.unroll.enable"}249!3 = distinct !{!3, !2}250!4 = distinct !{!4, !2}251!5 = distinct !{!5, !6}252!6 = !{!"llvm.loop.unroll.disable"}253!7 = distinct !{!7, !8}254!8 = !{!"llvm.loop.unroll.count", i32 4}255!9 = distinct !{!9, !10}256!10 = !{!"llvm.loop.unroll.full"}257!11 = distinct !{!11, !10, !8}258!12 = distinct !{!12, !2, !6}259