brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.5 KiB · 1259748 Raw
358 lines · plain
1// RUN: mlir-opt %s | mlir-opt | FileCheck %s2// RUN: mlir-opt %s -canonicalize | FileCheck %s3 4// CHECK: emitc.include <"test.h">5// CHECK: emitc.include "test.h"6emitc.include <"test.h">7emitc.include "test.h"8 9// CHECK-LABEL: func @f(%{{.*}}: i32, %{{.*}}: !emitc.opaque<"int32_t">) {10func.func @f(%arg0: i32, %f: !emitc.opaque<"int32_t">) {11  %1 = "emitc.call_opaque"() {callee = "blah"} : () -> i6412  emitc.call_opaque "foo" (%1) {args = [13    0 : index, dense<[0, 1]> : tensor<2xi32>, 0 : index14  ]} : (i64) -> ()15  return16}17 18emitc.declare_func @func19 20emitc.func @func(%arg0 : i32) {21  emitc.call_opaque "foo"(%arg0) : (i32) -> ()22  emitc.return23}24 25emitc.func @return_i32() -> i32 attributes {specifiers = ["static","inline"]} {26  %0 = emitc.call_opaque "foo"(): () -> i3227  emitc.return %0 : i3228}29 30emitc.func @call() -> i32 {31  %0 = emitc.call @return_i32() : () -> (i32)32  emitc.return %0 : i3233}34 35emitc.func private @extern(i32) attributes {specifiers = ["extern"]}36 37func.func @cast(%arg0: i32) {38  %1 = emitc.cast %arg0: i32 to f3239  return40}41 42func.func @cast_array_to_pointer(%arg0: !emitc.array<3xi32>) {43  %1 = emitc.cast %arg0: !emitc.array<3xi32> to !emitc.ptr<i32>44  return45}46 47func.func @c() {48  %1 = "emitc.constant"(){value = 42 : i32} : () -> i3249  %2 = "emitc.constant"(){value = 42 : index} : () -> !emitc.size_t50  %3 = "emitc.constant"(){value = 42 : index} : () -> !emitc.ssize_t51  %4 = "emitc.constant"(){value = 42 : index} : () -> !emitc.ptrdiff_t52  return53}54 55func.func @a() {56  %0 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<i32>57  %1 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<i32>58  %2 = "emitc.apply"(%0) {applicableOperator = "&"} : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>59  %3 = emitc.apply "&"(%1) : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>60  return61}62 63func.func @add_int(%arg0: i32, %arg1: i32) {64  %1 = "emitc.add" (%arg0, %arg1) : (i32, i32) -> i3265  return66}67 68func.func @add_pointer(%arg0: !emitc.ptr<f32>, %arg1: i32, %arg2: !emitc.opaque<"unsigned int">) {69  %1 = "emitc.add" (%arg0, %arg1) : (!emitc.ptr<f32>, i32) -> !emitc.ptr<f32>70  %2 = "emitc.add" (%arg0, %arg2) : (!emitc.ptr<f32>, !emitc.opaque<"unsigned int">) -> !emitc.ptr<f32>71  return72}73 74func.func @bitwise(%arg0: i32, %arg1: i32) -> () {75  %0 = emitc.bitwise_and %arg0, %arg1 : (i32, i32) -> i3276  %1 = emitc.bitwise_left_shift %arg0, %arg1 : (i32, i32) -> i3277  %2 = emitc.bitwise_not %arg0 : (i32) -> i3278  %3 = emitc.bitwise_or %arg0, %arg1 : (i32, i32) -> i3279  %4 = emitc.bitwise_right_shift %arg0, %arg1 : (i32, i32) -> i3280  %5 = emitc.bitwise_xor %arg0, %arg1 : (i32, i32) -> i3281  return82}83 84func.func @cond(%cond: i1, %arg0: i32, %arg1: i32) -> () {85  %0 = emitc.conditional %cond, %arg0, %arg1 : i3286  return87}88 89func.func @div_int(%arg0: i32, %arg1: i32) {90  %1 = "emitc.div" (%arg0, %arg1) : (i32, i32) -> i3291  return92}93 94func.func @div_float(%arg0: f32, %arg1: f32) {95  %1 = "emitc.div" (%arg0, %arg1) : (f32, f32) -> f3296  return97}98 99func.func @mul_int(%arg0: i32, %arg1: i32) {100  %1 = "emitc.mul" (%arg0, %arg1) : (i32, i32) -> i32101  return102}103 104func.func @mul_float(%arg0: f32, %arg1: f32) {105  %1 = "emitc.mul" (%arg0, %arg1) : (f32, f32) -> f32106  return107}108 109func.func @rem(%arg0: i32, %arg1: i32) {110  %1 = "emitc.rem" (%arg0, %arg1) : (i32, i32) -> i32111  return112}113 114func.func @sub_int(%arg0: i32, %arg1: i32) {115  %1 = "emitc.sub" (%arg0, %arg1) : (i32, i32) -> i32116  return117}118 119func.func @sub_pointer(%arg0: !emitc.ptr<f32>, %arg1: i32, %arg2: !emitc.opaque<"unsigned int">, %arg3: !emitc.ptr<f32>) {120  %1 = "emitc.sub" (%arg0, %arg1) : (!emitc.ptr<f32>, i32) -> !emitc.ptr<f32>121  %2 = "emitc.sub" (%arg0, %arg2) : (!emitc.ptr<f32>, !emitc.opaque<"unsigned int">) -> !emitc.ptr<f32>122  %3 = "emitc.sub" (%arg0, %arg3) : (!emitc.ptr<f32>, !emitc.ptr<f32>) -> !emitc.opaque<"ptrdiff_t">123  %4 = "emitc.sub" (%arg0, %arg3) : (!emitc.ptr<f32>, !emitc.ptr<f32>) -> i32124  %5 = "emitc.sub" (%arg0, %arg3) : (!emitc.ptr<f32>, !emitc.ptr<f32>) -> !emitc.ptrdiff_t125  return126}127 128func.func @cmp(%arg0 : i32, %arg1 : f32, %arg2 : i64, %arg3 : f64, %arg4 : !emitc.opaque<"unsigned">, %arg5 : !emitc.opaque<"std::valarray<int>">, %arg6 : !emitc.opaque<"custom">) {129  %1 = "emitc.cmp" (%arg0, %arg0) {predicate = 0} : (i32, i32) -> i1130  %2 = emitc.cmp eq, %arg0, %arg0 : (i32, i32) -> i1131  %3 = "emitc.cmp" (%arg1, %arg1) {predicate = 1} : (f32, f32) -> i1132  %4 = emitc.cmp ne, %arg1, %arg1 : (f32, f32) -> i1133  %5 = "emitc.cmp" (%arg2, %arg2) {predicate = 2} : (i64, i64) -> i1134  %6 = emitc.cmp lt, %arg2, %arg2 : (i64, i64) -> i1135  %7 = "emitc.cmp" (%arg3, %arg3) {predicate = 3} : (f64, f64) -> i1136  %8 = emitc.cmp le, %arg3, %arg3 : (f64, f64) -> i1137  %9 = "emitc.cmp" (%arg4, %arg4) {predicate = 4} : (!emitc.opaque<"unsigned">, !emitc.opaque<"unsigned">) -> i1138  %10 = emitc.cmp gt, %arg4, %arg4 : (!emitc.opaque<"unsigned">, !emitc.opaque<"unsigned">) -> i1139  %11 = "emitc.cmp" (%arg5, %arg5) {predicate = 5} : (!emitc.opaque<"std::valarray<int>">, !emitc.opaque<"std::valarray<int>">) -> !emitc.opaque<"std::valarray<bool>">140  %12 = emitc.cmp ge, %arg5, %arg5 : (!emitc.opaque<"std::valarray<int>">, !emitc.opaque<"std::valarray<int>">) -> !emitc.opaque<"std::valarray<bool>">141  %13 = "emitc.cmp" (%arg6, %arg6) {predicate = 6} : (!emitc.opaque<"custom">, !emitc.opaque<"custom">) -> !emitc.opaque<"custom">142  %14 = emitc.cmp three_way, %arg6, %arg6 : (!emitc.opaque<"custom">, !emitc.opaque<"custom">) -> !emitc.opaque<"custom">143  return144}145 146func.func @logical(%arg0: i32, %arg1: i32) {147  %0 = emitc.logical_and %arg0, %arg1 : i32, i32148  %1 = emitc.logical_not %arg0 : i32149  %2 = emitc.logical_or %arg0, %arg1 : i32, i32150  return151}152 153func.func @unary(%arg0: i32) {154  %0 = emitc.unary_minus %arg0 : (i32) -> i32155  %1 = emitc.unary_plus %arg0 : (i32) -> i32156  return157}158 159func.func @test_if(%arg0: i1, %arg1: f32) {160  emitc.if %arg0 {161     %0 = emitc.call_opaque "func_const"(%arg1) : (f32) -> i32162  }163  return164}165 166func.func @test_if_explicit_yield(%arg0: i1, %arg1: f32) {167  emitc.if %arg0 {168     %0 = emitc.call_opaque "func_const"(%arg1) : (f32) -> i32169     emitc.yield170  }171  return172}173 174func.func @test_if_else(%arg0: i1, %arg1: f32) {175  emitc.if %arg0 {176    %0 = emitc.call_opaque "func_true"(%arg1) : (f32) -> i32177  } else {178    %0 = emitc.call_opaque "func_false"(%arg1) : (f32) -> i32179  }180  return181}182 183func.func @test_assign(%arg1: f32) {184  %v = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32>185  emitc.assign %arg1 : f32 to %v : !emitc.lvalue<f32>186  return187}188 189func.func @test_expression(%arg0: i32, %arg1: i32, %arg2: i32, %arg3: f32, %arg4: f32) -> i32 {190  %c7 = "emitc.constant"() {value = 7 : i32} : () -> i32191  %q = emitc.expression %arg1, %c7 : (i32, i32) -> i32 {192    %a = emitc.rem %arg1, %c7 : (i32, i32) -> i32193    emitc.yield %a : i32194  }195  %r = emitc.expression %arg0, %arg1, %arg2, %arg3, %arg4, %q noinline : (i32, i32, i32, f32, f32, i32) -> i32 {196    %a = emitc.add %arg0, %arg1 : (i32, i32) -> i32197    %b = emitc.call_opaque "bar" (%a, %arg2, %q) : (i32, i32, i32) -> (i32)198    %c = emitc.mul %arg3, %arg4 : (f32, f32) -> f32199    %d = emitc.cast %c : f32 to i32200    %e = emitc.sub %b, %d : (i32, i32) -> i32201    emitc.yield %e : i32202  }203  return %r : i32204}205 206func.func @test_expression_multiple_uses(%arg0: i32, %arg1: i32) -> i32 {207  %r = emitc.expression %arg0, %arg1 : (i32, i32) -> i32 {208    %a = emitc.rem %arg0, %arg1 : (i32, i32) -> i32209    %b = emitc.add %a, %arg0 : (i32, i32) -> i32210    %c = emitc.mul %b, %a : (i32, i32) -> i32211    emitc.yield %c : i32212  }213  return %r : i32214}215 216func.func @test_for(%arg0 : index, %arg1 : index, %arg2 : index) {217  emitc.for %i0 = %arg0 to %arg1 step %arg2 {218    %0 = emitc.call_opaque "func_const"(%i0) : (index) -> i32219  }220  return221}222 223func.func @test_for_explicit_yield(%arg0 : index, %arg1 : index, %arg2 : index) {224  emitc.for %i0 = %arg0 to %arg1 step %arg2 {225    %0 = emitc.call_opaque "func_const"(%i0) : (index) -> i32226    emitc.yield227  }228  return229}230 231func.func @test_for_not_index_induction(%arg0 : i16, %arg1 : i16, %arg2 : i16) {232  emitc.for %i0 = %arg0 to %arg1 step %arg2 : i16 {233    %0 = emitc.call_opaque "func_const"(%i0) : (i16) -> i32234  }235  return236}237 238func.func @test_subscript(%arg0 : !emitc.array<2x3xf32>, %arg1 : !emitc.ptr<i32>, %arg2 : !emitc.opaque<"std::map<char, int>">, %idx0 : index, %idx1 : i32, %idx2 : !emitc.opaque<"char">) {239  %0 = emitc.subscript %arg0[%idx0, %idx1] : (!emitc.array<2x3xf32>, index, i32) -> !emitc.lvalue<f32>240  %1 = emitc.subscript %arg1[%idx0] : (!emitc.ptr<i32>, index) -> !emitc.lvalue<i32>241  %2 = emitc.subscript %arg2[%idx2] : (!emitc.opaque<"std::map<char, int>">, !emitc.opaque<"char">) -> !emitc.lvalue<!emitc.opaque<"int">>242  return243}244 245emitc.verbatim "#ifdef __cplusplus"246emitc.verbatim "extern \"C\" {"247emitc.verbatim "#endif  // __cplusplus"248 249emitc.verbatim "#ifdef __cplusplus"250emitc.verbatim "}  // extern \"C\""251emitc.verbatim "#endif  // __cplusplus"252 253emitc.verbatim "typedef int32_t i32;"254emitc.verbatim "typedef float f32;"255 256// The value is not interpreted as format string if there are no operands.257emitc.verbatim "{} {  }"258 259func.func @test_verbatim(%arg0 : !emitc.ptr<i32>, %arg1 : i32, %arg2: !emitc.array<3x!emitc.ptr<i32>>) {260  %a = "emitc.variable"() <{value = #emitc.opaque<"1">}> : () -> !emitc.lvalue<i32>261 262  // Check that the lvalue type can be used by verbatim.263  emitc.verbatim "++{};" args %a : !emitc.lvalue<i32>264 265  // Check that the array type can be used by verbatim.266  emitc.verbatim "*{}[0] = 1;" args %arg2 : !emitc.array<3x!emitc.ptr<i32>>267 268  emitc.verbatim "{} + {};" args %arg0, %arg1 : !emitc.ptr<i32>, i32269 270  // Check there is no ambiguity whether %b is the argument to the emitc.verbatim op.271  emitc.verbatim "b"272  %b = "emitc.constant"(){value = 42 : i32} : () -> i32273 274  return275}276 277emitc.global @uninit : i32278emitc.global @myglobal_int : i32 = 4279emitc.global extern @external_linkage : i32280emitc.global static @internal_linkage : i32281emitc.global @myglobal : !emitc.array<2xf32> = dense<4.000000e+00>282emitc.global const @myconstant : !emitc.array<2xi16> = dense<2>283 284func.func @use_global(%i: index) -> f32 {285  %0 = emitc.get_global @myglobal : !emitc.array<2xf32>286  %1 = emitc.subscript %0[%i] : (!emitc.array<2xf32>, index) -> !emitc.lvalue<f32>287  %2 = emitc.load %1 : <f32>288  return %2 : f32289}290 291func.func @assign_global(%arg0 : i32) {292  %0 = emitc.get_global @myglobal_int : !emitc.lvalue<i32>293  emitc.assign %arg0 : i32 to %0 : !emitc.lvalue<i32>294  return295}296 297func.func @member_access(%arg0: !emitc.lvalue<!emitc.opaque<"mystruct">>, %arg1: !emitc.lvalue<!emitc.opaque<"mystruct_ptr">>, %arg2: !emitc.lvalue<!emitc.ptr<!emitc.opaque<"mystruct">>>) {298  %0 = "emitc.member" (%arg0) {member = "a"} : (!emitc.lvalue<!emitc.opaque<"mystruct">>) -> !emitc.lvalue<i32>299  %1 = "emitc.member" (%arg0) {member = "b"} : (!emitc.lvalue<!emitc.opaque<"mystruct">>) -> !emitc.array<2xi32>300  %2 = "emitc.member_of_ptr" (%arg1) {member = "a"} : (!emitc.lvalue<!emitc.opaque<"mystruct_ptr">>) -> !emitc.lvalue<i32>301  %3 = "emitc.member_of_ptr" (%arg1) {member = "b"} : (!emitc.lvalue<!emitc.opaque<"mystruct_ptr">>) -> !emitc.array<2xi32>302  %4 = "emitc.member_of_ptr" (%arg2) {member = "a"} : (!emitc.lvalue<!emitc.ptr<!emitc.opaque<"mystruct">>>) -> !emitc.lvalue<i32>303  %5 = "emitc.member_of_ptr" (%arg2) {member = "b"} : (!emitc.lvalue<!emitc.ptr<!emitc.opaque<"mystruct">>>) -> !emitc.array<2xi32>304  return305}306 307func.func @switch() {308  %0 = "emitc.constant"(){value = 1 : index} : () -> !emitc.ptrdiff_t309 310  emitc.switch %0 : !emitc.ptrdiff_t311  case 1 {312    %1 = emitc.call_opaque "func_b" () : () -> i32313    emitc.yield314  }315  case 2 {316    %2 = emitc.call_opaque "func_a" () : () -> i32317    emitc.yield318  }319  default {320    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32321    emitc.call_opaque "func2" (%3) : (f32) -> ()322  }323 324  return 325}326 327emitc.class final @finalClass {328  emitc.field @fieldName0 : !emitc.array<1xf32>329  emitc.field @fieldName1 : !emitc.array<1xf32>330  emitc.func @execute() {331    %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t332    %1 = get_field @fieldName0 : !emitc.array<1xf32>333    %2 = get_field @fieldName1 : !emitc.array<1xf32>334    %3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue<f32>335    return336  }337}338 339func.func @do(%arg0 : !emitc.ptr<i32>) {340  %1 = emitc.literal "1" : i32341  %2 = emitc.literal "2" : i32342  %3 = emitc.literal "3" : i32343 344  emitc.do {345    emitc.verbatim "printf(\"%d\", *{});" args %arg0 : !emitc.ptr<i32>346  } while {347    %r = emitc.expression %1, %2, %3 : (i32, i32, i32) -> i1 {348      %add = emitc.add %1, %2 : (i32, i32) -> i32349      %cmp = emitc.cmp eq, %add, %3 : (i32, i32) -> i1350      emitc.yield %cmp : i1351    }352    353    emitc.yield %r : i1354  }355 356  return357}358