131 lines · plain
1// RUN: mlir-opt -allow-unregistered-dialect -convert-scf-to-spirv %s -o - | FileCheck %s2 3module attributes {4 spirv.target_env = #spirv.target_env<5 #spirv.vce<v1.0, [Shader, Int64], [SPV_KHR_storage_buffer_storage_class]>, #spirv.resource_limits<>>6} {7 8// CHECK-LABEL: @while_loop19func.func @while_loop1(%arg0: i32, %arg1: i32) -> i32 {10 // CHECK-SAME: (%[[ARG1:.*]]: i32, %[[ARG2:.*]]: i32)11 // CHECK: %[[INITVAR:.*]] = spirv.Constant 2 : i3212 // CHECK: %[[VAR1:.*]] = spirv.Variable : !spirv.ptr<i32, Function>13 // CHECK: spirv.mlir.loop {14 // CHECK: spirv.Branch ^[[HEADER:.*]](%[[ARG1]] : i32)15 // CHECK: ^[[HEADER]](%[[INDVAR1:.*]]: i32):16 // CHECK: %[[CMP:.*]] = spirv.SLessThan %[[INDVAR1]], %[[ARG2]] : i3217 // CHECK: spirv.Store "Function" %[[VAR1]], %[[INDVAR1]] : i3218 // CHECK: spirv.BranchConditional %[[CMP]], ^[[BODY:.*]](%[[INDVAR1]] : i32), ^[[MERGE:.*]]19 // CHECK: ^[[BODY]](%[[INDVAR2:.*]]: i32):20 // CHECK: %[[UPDATED:.*]] = spirv.IMul %[[INDVAR2]], %[[INITVAR]] : i3221 // CHECK: spirv.Branch ^[[HEADER]](%[[UPDATED]] : i32)22 // CHECK: ^[[MERGE]]:23 // CHECK: spirv.mlir.merge24 // CHECK: }25 %c2_i32 = arith.constant 2 : i3226 %0 = scf.while (%arg3 = %arg0) : (i32) -> (i32) {27 %1 = arith.cmpi slt, %arg3, %arg1 : i3228 scf.condition(%1) %arg3 : i3229 } do {30 ^bb0(%arg5: i32):31 %1 = arith.muli %arg5, %c2_i32 : i3232 scf.yield %1 : i3233 }34 // CHECK: %[[OUT:.*]] = spirv.Load "Function" %[[VAR1]] : i3235 // CHECK: spirv.ReturnValue %[[OUT]] : i3236 return %0 : i3237}38 39// -----40 41// CHECK-LABEL: @while_loop242func.func @while_loop2(%arg0: f32) -> i64 {43 // CHECK-SAME: (%[[ARG:.*]]: f32)44 // CHECK: %[[VAR:.*]] = spirv.Variable : !spirv.ptr<i64, Function>45 // CHECK: spirv.mlir.loop {46 // CHECK: spirv.Branch ^[[HEADER:.*]](%[[ARG]] : f32)47 // CHECK: ^[[HEADER]](%[[INDVAR1:.*]]: f32):48 // CHECK: %[[SHARED:.*]] = "foo.shared_compute"(%[[INDVAR1]]) : (f32) -> i6449 // CHECK: %[[CMP:.*]] = "foo.evaluate_condition"(%[[INDVAR1]], %[[SHARED]]) : (f32, i64) -> i150 // CHECK: spirv.Store "Function" %[[VAR]], %[[SHARED]] : i6451 // CHECK: spirv.BranchConditional %[[CMP]], ^[[BODY:.*]](%[[SHARED]] : i64), ^[[MERGE:.*]]52 // CHECK: ^[[BODY]](%[[INDVAR2:.*]]: i64):53 // CHECK: %[[UPDATED:.*]] = "foo.payload"(%[[INDVAR2]]) : (i64) -> f3254 // CHECK: spirv.Branch ^[[HEADER]](%[[UPDATED]] : f32)55 // CHECK: ^[[MERGE]]:56 // CHECK: spirv.mlir.merge57 // CHECK: }58 %res = scf.while (%arg1 = %arg0) : (f32) -> i64 {59 %shared = "foo.shared_compute"(%arg1) : (f32) -> i6460 %condition = "foo.evaluate_condition"(%arg1, %shared) : (f32, i64) -> i161 scf.condition(%condition) %shared : i6462 } do {63 ^bb0(%arg2: i64):64 %res = "foo.payload"(%arg2) : (i64) -> f3265 scf.yield %res : f3266 }67 // CHECK: %[[OUT:.*]] = spirv.Load "Function" %[[VAR]] : i6468 // CHECK: spirv.ReturnValue %[[OUT]] : i6469 return %res : i6470}71 72// -----73 74// CHECK-LABEL: @while_loop_before_typeconv75func.func @while_loop_before_typeconv(%arg0: index) -> i64 {76 // CHECK-SAME: (%[[ARG:.*]]: i32)77 // CHECK: %[[VAR:.*]] = spirv.Variable : !spirv.ptr<i64, Function>78 // CHECK: spirv.mlir.loop {79 // CHECK: spirv.Branch ^[[HEADER:.*]](%[[ARG]] : i32)80 // CHECK: ^[[HEADER]](%[[INDVAR1:.*]]: i32):81 // CHECK: spirv.BranchConditional %{{.*}}, ^[[BODY:.*]](%{{.*}} : i64), ^[[MERGE:.*]]82 // CHECK: ^[[BODY]](%[[INDVAR2:.*]]: i64):83 // CHECK: spirv.Branch ^[[HEADER]](%{{.*}} : i32)84 // CHECK: ^[[MERGE]]:85 // CHECK: spirv.mlir.merge86 // CHECK: }87 %res = scf.while (%arg1 = %arg0) : (index) -> i64 {88 %shared = "foo.shared_compute"(%arg1) : (index) -> i6489 %condition = "foo.evaluate_condition"(%arg1, %shared) : (index, i64) -> i190 scf.condition(%condition) %shared : i6491 } do {92 ^bb0(%arg2: i64):93 %res = "foo.payload"(%arg2) : (i64) -> index94 scf.yield %res : index95 }96 // CHECK: %[[OUT:.*]] = spirv.Load "Function" %[[VAR]] : i6497 // CHECK: spirv.ReturnValue %[[OUT]] : i6498 return %res : i6499}100 101// -----102 103// CHECK-LABEL: @while_loop_after_typeconv104func.func @while_loop_after_typeconv(%arg0: f32) -> index {105 // CHECK-SAME: (%[[ARG:.*]]: f32)106 // CHECK: %[[VAR:.*]] = spirv.Variable : !spirv.ptr<i32, Function>107 // CHECK: spirv.mlir.loop {108 // CHECK: spirv.Branch ^[[HEADER:.*]](%[[ARG]] : f32)109 // CHECK: ^[[HEADER]](%[[INDVAR1:.*]]: f32):110 // CHECK: spirv.BranchConditional %{{.*}}, ^[[BODY:.*]](%{{.*}} : i32), ^[[MERGE:.*]]111 // CHECK: ^[[BODY]](%[[INDVAR2:.*]]: i32):112 // CHECK: spirv.Branch ^[[HEADER]](%{{.*}} : f32)113 // CHECK: ^[[MERGE]]:114 // CHECK: spirv.mlir.merge115 // CHECK: }116 %res = scf.while (%arg1 = %arg0) : (f32) -> index {117 %shared = "foo.shared_compute"(%arg1) : (f32) -> index118 %condition = "foo.evaluate_condition"(%arg1, %shared) : (f32, index) -> i1119 scf.condition(%condition) %shared : index120 } do {121 ^bb0(%arg2: index):122 %res = "foo.payload"(%arg2) : (index) -> f32123 scf.yield %res : f32124 }125 // CHECK: %[[OUT:.*]] = spirv.Load "Function" %[[VAR]] : i32126 // CHECK: spirv.ReturnValue %[[OUT]] : i32127 return %res : index128}129 130} // end module131