brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.7 KiB · b9a4295 Raw
343 lines · plain
1// RUN: mlir-translate -no-implicit-module -split-input-file -test-spirv-roundtrip %s | FileCheck %s2 3// RUN: %if spirv-tools %{ rm -rf %t %}4// RUN: %if spirv-tools %{ mkdir %t %}5// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --split-input-file --spirv-save-validation-files-with-prefix=%t/module %s %}6// RUN: %if spirv-tools %{ spirv-val %t %}7 8// Single loop9 10spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {11  // for (int i = 0; i < count; ++i) {}12// CHECK-LABEL: @loop13  spirv.func @loop(%count : i32) -> () "None" {14    %zero = spirv.Constant 0: i3215    %one = spirv.Constant 1: i3216    %var = spirv.Variable init(%zero) : !spirv.ptr<i32, Function>17 18// CHECK:        spirv.Branch ^bb119// CHECK-NEXT: ^bb1:20// CHECK-NEXT:   spirv.mlir.loop21    spirv.mlir.loop {22// CHECK-NEXT:     spirv.Branch ^bb123      spirv.Branch ^header24 25// CHECK-NEXT:   ^bb1:26    ^header:27// CHECK-NEXT:     spirv.Load28      %val0 = spirv.Load "Function" %var : i3229// CHECK-NEXT:     spirv.SLessThan30      %cmp = spirv.SLessThan %val0, %count : i3231// CHECK-NEXT:     spirv.BranchConditional %{{.*}} [1, 1], ^bb2, ^bb432      spirv.BranchConditional %cmp [1, 1], ^body, ^merge33 34// CHECK-NEXT:   ^bb2:35    ^body:36      // Do nothing37// CHECK-NEXT:     spirv.Branch ^bb338      spirv.Branch ^continue39 40// CHECK-NEXT:   ^bb3:41    ^continue:42// CHECK-NEXT:     spirv.Load43      %val1 = spirv.Load "Function" %var : i3244// CHECK-NEXT:     spirv.Constant 145// CHECK-NEXT:     spirv.IAdd46      %add = spirv.IAdd %val1, %one : i3247// CHECK-NEXT:     spirv.Store48      spirv.Store "Function" %var, %add : i3249// CHECK-NEXT:     spirv.Branch ^bb150      spirv.Branch ^header51 52// CHECK-NEXT:   ^bb4:53// CHECK-NEXT:     spirv.mlir.merge54    ^merge:55      spirv.mlir.merge56    }57    spirv.Return58  }59 60  spirv.func @main() -> () "None" {61    spirv.Return62  }63  spirv.EntryPoint "GLCompute" @main64}65 66// -----67 68// Single loop with block arguments69 70spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], [SPV_KHR_storage_buffer_storage_class]> {71  spirv.GlobalVariable @GV1 bind(0, 0) : !spirv.ptr<!spirv.struct<(!spirv.array<10 x f32, stride=4> [0])>, StorageBuffer>72  spirv.GlobalVariable @GV2 bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.array<10 x f32, stride=4> [0])>, StorageBuffer>73// CHECK-LABEL: @loop_kernel74  spirv.func @loop_kernel() "None" {75    %0 = spirv.mlir.addressof @GV1 : !spirv.ptr<!spirv.struct<(!spirv.array<10 x f32, stride=4> [0])>, StorageBuffer>76    %1 = spirv.Constant 0 : i3277    %2 = spirv.AccessChain %0[%1] : !spirv.ptr<!spirv.struct<(!spirv.array<10 x f32, stride=4> [0])>, StorageBuffer>, i32 -> !spirv.ptr<!spirv.array<10 x f32, stride=4>, StorageBuffer>78    %3 = spirv.mlir.addressof @GV2 : !spirv.ptr<!spirv.struct<(!spirv.array<10 x f32, stride=4> [0])>, StorageBuffer>79    %5 = spirv.AccessChain %3[%1] : !spirv.ptr<!spirv.struct<(!spirv.array<10 x f32, stride=4> [0])>, StorageBuffer>, i32 -> !spirv.ptr<!spirv.array<10 x f32, stride=4>, StorageBuffer>80    %6 = spirv.Constant 4 : i3281    %7 = spirv.Constant 42 : i3282    %8 = spirv.Constant 2 : i3283// CHECK:        spirv.Branch ^bb1(%{{.*}} : i32)84// CHECK-NEXT: ^bb1(%[[OUTARG:.*]]: i32):85// CHECK-NEXT:   spirv.mlir.loop {86    spirv.mlir.loop {87// CHECK-NEXT:     spirv.Branch ^bb1(%[[OUTARG]] : i32)88      spirv.Branch ^header(%6 : i32)89// CHECK-NEXT:   ^bb1(%[[HEADARG:.*]]: i32):90    ^header(%9: i32):91      %10 = spirv.SLessThan %9, %7 : i3292// CHECK:          spirv.BranchConditional %{{.*}}, ^bb2, ^bb393      spirv.BranchConditional %10, ^body, ^merge94// CHECK-NEXT:   ^bb2:     // pred: ^bb195    ^body:96      %11 = spirv.AccessChain %2[%9] : !spirv.ptr<!spirv.array<10 x f32, stride=4>, StorageBuffer>, i32 -> !spirv.ptr<f32, StorageBuffer>97      %12 = spirv.Load "StorageBuffer" %11 : f3298      %13 = spirv.AccessChain %5[%9] : !spirv.ptr<!spirv.array<10 x f32, stride=4>, StorageBuffer>, i32 -> !spirv.ptr<f32, StorageBuffer>99      spirv.Store "StorageBuffer" %13, %12 : f32100// CHECK:          %[[ADD:.*]] = spirv.IAdd101      %14 = spirv.IAdd %9, %8 : i32102// CHECK-NEXT:     spirv.Branch ^bb1(%[[ADD]] : i32)103      spirv.Branch ^header(%14 : i32)104// CHECK-NEXT:   ^bb3:105    ^merge:106// CHECK-NEXT:     spirv.mlir.merge107      spirv.mlir.merge108    }109    spirv.Return110  }111  spirv.EntryPoint "GLCompute" @loop_kernel112  spirv.ExecutionMode @loop_kernel "LocalSize", 1, 1, 1113}114 115// -----116 117// Nested loop118 119spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {120  // for (int i = 0; i < count; ++i) {121  //   for (int j = 0; j < count; ++j) { }122  // }123// CHECK-LABEL: @loop124  spirv.func @loop(%count : i32) -> () "None" {125    %zero = spirv.Constant 0: i32126    %one = spirv.Constant 1: i32127    %ivar = spirv.Variable init(%zero) : !spirv.ptr<i32, Function>128    %jvar = spirv.Variable init(%zero) : !spirv.ptr<i32, Function>129 130// CHECK:        spirv.Branch ^bb1131// CHECK-NEXT: ^bb1:132// CHECK-NEXT:   spirv.mlir.loop control(Unroll)133    spirv.mlir.loop control(Unroll) {134// CHECK-NEXT:     spirv.Branch ^bb1135      spirv.Branch ^header136 137// CHECK-NEXT:   ^bb1:138    ^header:139// CHECK-NEXT:     spirv.Load140      %ival0 = spirv.Load "Function" %ivar : i32141// CHECK-NEXT:     spirv.SLessThan142      %icmp = spirv.SLessThan %ival0, %count : i32143// CHECK-NEXT:     spirv.BranchConditional %{{.*}}, ^bb2, ^bb5144      spirv.BranchConditional %icmp, ^body, ^merge145 146// CHECK-NEXT:   ^bb2:147    ^body:148// CHECK-NEXT:     spirv.Constant 0149// CHECK-NEXT: 		 spirv.Store150      spirv.Store "Function" %jvar, %zero : i32151// CHECK-NEXT:     spirv.Branch ^bb3152// CHECK-NEXT:   ^bb3:153// CHECK-NEXT:     spirv.mlir.loop control(DontUnroll)154      spirv.mlir.loop control(DontUnroll) {155// CHECK-NEXT:       spirv.Branch ^bb1156        spirv.Branch ^header157 158// CHECK-NEXT:     ^bb1:159      ^header:160// CHECK-NEXT:       spirv.Load161        %jval0 = spirv.Load "Function" %jvar : i32162// CHECK-NEXT:       spirv.SLessThan163        %jcmp = spirv.SLessThan %jval0, %count : i32164// CHECK-NEXT:       spirv.BranchConditional %{{.*}}, ^bb2, ^bb4165        spirv.BranchConditional %jcmp, ^body, ^merge166 167// CHECK-NEXT:     ^bb2:168      ^body:169        // Do nothing170// CHECK-NEXT:       spirv.Branch ^bb3171        spirv.Branch ^continue172 173// CHECK-NEXT:     ^bb3:174      ^continue:175// CHECK-NEXT:       spirv.Load176        %jval1 = spirv.Load "Function" %jvar : i32177// CHECK-NEXT:       spirv.Constant 1178// CHECK-NEXT:       spirv.IAdd179        %add = spirv.IAdd %jval1, %one : i32180// CHECK-NEXT:       spirv.Store181        spirv.Store "Function" %jvar, %add : i32182// CHECK-NEXT:       spirv.Branch ^bb1183        spirv.Branch ^header184 185// CHECK-NEXT:     ^bb4:186      ^merge:187// CHECK-NEXT:       spirv.mlir.merge188        spirv.mlir.merge189      } // end inner loop190 191// CHECK:          spirv.Branch ^bb4192      spirv.Branch ^continue193 194// CHECK-NEXT:   ^bb4:195    ^continue:196// CHECK-NEXT:     spirv.Load197      %ival1 = spirv.Load "Function" %ivar : i32198// CHECK-NEXT:     spirv.Constant 1199// CHECK-NEXT:     spirv.IAdd200      %add = spirv.IAdd %ival1, %one : i32201// CHECK-NEXT:     spirv.Store202      spirv.Store "Function" %ivar, %add : i32203// CHECK-NEXT:     spirv.Branch ^bb1204      spirv.Branch ^header205 206// CHECK-NEXT:   ^bb5:207// CHECK-NEXT:     spirv.mlir.merge208    ^merge:209      spirv.mlir.merge210    } // end outer loop211    spirv.Return212  }213 214  spirv.func @main() -> () "None" {215    spirv.Return216  }217  spirv.EntryPoint "GLCompute" @main218}219 220 221// -----222 223// Loop with selection in its header224 225spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Kernel, Linkage, Addresses, Int64], []> {226// CHECK-LABEL:   @kernel227// CHECK-SAME:    (%[[INPUT0:.+]]: i64)228  spirv.func @kernel(%input: i64) "None" {229// CHECK-NEXT:     %[[VAR:.+]] = spirv.Variable : !spirv.ptr<i1, Function>230// CHECK-NEXT:     spirv.Branch ^[[BB0:.+]](%[[INPUT0]] : i64)231// CHECK-NEXT:   ^[[BB0]](%[[INPUT1:.+]]: i64):232    %cst0_i64 = spirv.Constant 0 : i64233    %true = spirv.Constant true234    %false = spirv.Constant false235// CHECK-NEXT:     spirv.mlir.loop {236    spirv.mlir.loop {237// CHECK-NEXT:       spirv.Branch ^[[LOOP_HEADER:.+]](%[[INPUT1]] : i64)238      spirv.Branch ^loop_header(%input : i64)239// CHECK-NEXT:     ^[[LOOP_HEADER]](%[[ARG1:.+]]: i64):240    ^loop_header(%arg1: i64):241// CHECK-NEXT:       spirv.Branch ^[[LOOP_BODY:.+]]242// CHECK-NEXT:     ^[[LOOP_BODY]]:243// CHECK-NEXT:         %[[C0:.+]] = spirv.Constant 0 : i64244      %gt = spirv.SGreaterThan %arg1, %cst0_i64 : i64245// CHECK-NEXT:         %[[GT:.+]] = spirv.SGreaterThan %[[ARG1]], %[[C0]] : i64246// CHECK-NEXT:         spirv.Branch ^[[BB1:.+]]247// CHECK-NEXT:     ^[[BB1]]:248      %var = spirv.Variable : !spirv.ptr<i1, Function>249// CHECK-NEXT:       spirv.mlir.selection {250      spirv.mlir.selection {251// CHECK-NEXT:         spirv.BranchConditional %[[GT]], ^[[THEN:.+]], ^[[ELSE:.+]]252        spirv.BranchConditional %gt, ^then, ^else253// CHECK-NEXT:       ^[[THEN]]:254      ^then:255// CHECK-NEXT:         %true = spirv.Constant true256// CHECK-NEXT:         spirv.Store "Function" %[[VAR]], %true : i1257        spirv.Store "Function" %var, %true : i1258// CHECK-NEXT:         spirv.Branch ^[[SELECTION_MERGE:.+]]259        spirv.Branch ^selection_merge260// CHECK-NEXT:       ^[[ELSE]]:261      ^else:262// CHECK-NEXT:         %false = spirv.Constant false263// CHECK-NEXT:         spirv.Store "Function" %[[VAR]], %false : i1264        spirv.Store "Function" %var, %false : i1265// CHECK-NEXT:         spirv.Branch ^[[SELECTION_MERGE]]266        spirv.Branch ^selection_merge267// CHECK-NEXT:       ^[[SELECTION_MERGE]]:268      ^selection_merge:269// CHECK-NEXT:         spirv.mlir.merge270        spirv.mlir.merge271// CHECK-NEXT:       }272      }273// CHECK-NEXT:       %[[LOAD:.+]] = spirv.Load "Function" %[[VAR]] : i1274      %load = spirv.Load "Function" %var : i1275// CHECK-NEXT:       spirv.BranchConditional %[[LOAD]], ^[[CONTINUE:.+]](%[[ARG1]] : i64), ^[[LOOP_MERGE:.+]]276      spirv.BranchConditional %load, ^continue(%arg1 : i64), ^loop_merge277// CHECK-NEXT:     ^[[CONTINUE]](%[[ARG2:.+]]: i64):278    ^continue(%arg2: i64):279// CHECK-NEXT:       %[[C0:.+]] = spirv.Constant 0 : i64280// CHECK-NEXT:       %[[LT:.+]] = spirv.SLessThan %[[ARG2]], %[[C0]] : i64281      %lt = spirv.SLessThan %arg2, %cst0_i64 : i64282// CHECK-NEXT:       spirv.Store "Function" %[[VAR]], %[[LT]] : i1283      spirv.Store "Function" %var, %lt : i1284// CHECK-NEXT:       spirv.Branch ^[[LOOP_HEADER]](%[[ARG2]] : i64)285      spirv.Branch ^loop_header(%arg2 : i64)286// CHECK-NEXT:     ^[[LOOP_MERGE]]:287    ^loop_merge:288// CHECK-NEXT:       spirv.mlir.merge289      spirv.mlir.merge290// CHECK-NEXT:     }291    }292// CHECK-NEXT:     spirv.Return293    spirv.Return294  }295}296 297// -----298 299// Loop yielding values300 301spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {302  spirv.func @loop_yield(%count : i32) -> () "None" {303    %zero = spirv.Constant 0: i32304    %one = spirv.Constant 1: i32305    %var = spirv.Variable init(%zero) : !spirv.ptr<i32, Function>306 307// CHECK: {{%.*}} = spirv.mlir.loop -> i32 {308    %final_i = spirv.mlir.loop -> i32 {309// CHECK-NEXT: spirv.Branch ^[[HEADER:.+]]({{%.*}}: i32)310      spirv.Branch ^header(%zero: i32)311 312// CHECK-NEXT: ^[[HEADER:.+]]({{%.*}}: i32):313    ^header(%i : i32):314      %cmp = spirv.SLessThan %i, %count : i32315// CHECK: spirv.BranchConditional %{{.*}}, ^[[BODY:.+]], ^[[MERGE:.+]]316      spirv.BranchConditional %cmp, ^body, ^merge317 318// CHECK-NEXT: ^[[BODY:.+]]:319    ^body:320// CHECK-NEXT: spirv.Branch ^[[CONTINUE:.+]]321      spirv.Branch ^continue322 323// CHECK-NEXT: ^[[CONTINUE:.+]]:324    ^continue:325      %new_i = spirv.IAdd %i, %one : i32326// CHECK: spirv.Branch ^[[HEADER:.+]]({{%.*}}: i32)327      spirv.Branch ^header(%new_i: i32)328 329// CHECK-NEXT: ^[[MERGE:.+]]:330    ^merge:331// CHECK-NEXT: spirv.mlir.merge {{%.*}} : i32332      spirv.mlir.merge %i : i32333// CHECK-NEXT: }334    }335 336// CHECK-NEXT: spirv.Store "Function" {{%.*}}, {{%.*}} : i32337    spirv.Store "Function" %var, %final_i : i32338 339// CHECK-NEXT: spirv.Return340    spirv.Return341  }342}343