|
| 1 | +// RUN: mlir-neura-opt %s \ |
| 2 | +// RUN: --assign-accelerator \ |
| 3 | +// RUN: --lower-llvm-to-neura \ |
| 4 | +// RUN: --leverage-predicated-value \ |
| 5 | +// RUN: | FileCheck %s |
| 6 | + |
| 7 | +// RUN: mlir-neura-opt %s \ |
| 8 | +// RUN: --assign-accelerator \ |
| 9 | +// RUN: --lower-llvm-to-neura \ |
| 10 | +// RUN: --leverage-predicated-value \ |
| 11 | +// RUN: --transform-ctrl-to-data-flow \ |
| 12 | +// RUN: | FileCheck %s -check-prefix=CTRL2DATA |
| 13 | + |
| 14 | +func.func @test(%in: i64) -> f32 { |
| 15 | + %c0 = llvm.mlir.constant(0 : i64) : i64 |
| 16 | + %c1 = llvm.mlir.constant(1.0 : f32) : f32 |
| 17 | + %c2 = llvm.mlir.constant(2.0 : f32) : f32 |
| 18 | + %c3 = llvm.mlir.constant(3.0 : f32) : f32 |
| 19 | + %cond = llvm.icmp "eq" %in, %c0 : i64 |
| 20 | + llvm.cond_br %cond, ^bb2(%c3 : f32), ^bb1(%c1, %c2 : f32, f32) |
| 21 | + |
| 22 | +^bb1(%ca: f32, %cb: f32): |
| 23 | + %a = llvm.fadd %ca, %cb : f32 |
| 24 | + llvm.br ^bb3(%a : f32) |
| 25 | + |
| 26 | +^bb2(%cc: f32): |
| 27 | + %b = llvm.fmul %cc, %c2 : f32 |
| 28 | + llvm.br ^bb3(%b : f32) |
| 29 | + |
| 30 | +^bb3(%v: f32): |
| 31 | + return %v : f32 |
| 32 | +} |
| 33 | + |
| 34 | +// CHECK: func.func @test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { |
| 35 | +// CHECK-NEXT: %0 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data<i64, i1> |
| 36 | +// CHECK-NEXT: %1 = "neura.constant"() <{predicate = true, value = 1.000000e+00 : f32}> : () -> !neura.data<f32, i1> |
| 37 | +// CHECK-NEXT: %2 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data<f32, i1> |
| 38 | +// CHECK-NEXT: %3 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data<f32, i1> |
| 39 | +// CHECK-NEXT: %4 = "neura.icmp"(%arg0, %0) <{cmpType = "eq"}> : (i64, !neura.data<i64, i1>) -> !neura.data<i1, i1> |
| 40 | +// CHECK-NEXT: neura.cond_br %4 : !neura.data<i1, i1> then %3 : !neura.data<f32, i1> to ^bb2 else %1, %2 : !neura.data<f32, i1>, !neura.data<f32, i1> to ^bb1 |
| 41 | +// CHECK-NEXT: ^bb1(%5: !neura.data<f32, i1>, %6: !neura.data<f32, i1>): // pred: ^bb0 |
| 42 | +// CHECK-NEXT: %7 = "neura.fadd"(%5, %6) : (!neura.data<f32, i1>, !neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 43 | +// CHECK-NEXT: neura.br %7 : !neura.data<f32, i1> to ^bb3 |
| 44 | +// CHECK-NEXT: ^bb2(%8: !neura.data<f32, i1>): // pred: ^bb0 |
| 45 | +// CHECK-NEXT: %9 = "neura.fmul"(%8, %2) : (!neura.data<f32, i1>, !neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 46 | +// CHECK-NEXT: neura.br %9 : !neura.data<f32, i1> to ^bb3 |
| 47 | +// CHECK-NEXT: ^bb3(%10: !neura.data<f32, i1>): // 2 preds: ^bb1, ^bb2 |
| 48 | +// CHECK-NEXT: "neura.return"(%10) : (!neura.data<f32, i1>) -> () |
| 49 | +// CHECK-NEXT: } |
| 50 | + |
| 51 | +// CTRL2DATA: func.func @test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { |
| 52 | +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data<i64, i1> |
| 53 | +// CTRL2DATA-NEXT: %1 = "neura.constant"() <{predicate = true, value = 1.000000e+00 : f32}> : () -> !neura.data<f32, i1> |
| 54 | +// CTRL2DATA-NEXT: %2 = "neura.grant_once"(%1) : (!neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 55 | +// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data<f32, i1> |
| 56 | +// CTRL2DATA-NEXT: %4 = "neura.grant_always"(%3) : (!neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 57 | +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%3) : (!neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 58 | +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data<f32, i1> |
| 59 | +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 60 | +// CTRL2DATA-NEXT: %8 = "neura.icmp"(%arg0, %0) <{cmpType = "eq"}> : (i64, !neura.data<i64, i1>) -> !neura.data<i1, i1> |
| 61 | +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data<i1, i1>) -> !neura.data<i1, i1> |
| 62 | +// CTRL2DATA-NEXT: %10 = neura.grant_predicate %7, %9 : !neura.data<f32, i1>, !neura.data<i1, i1> -> !neura.data<f32, i1> |
| 63 | +// CTRL2DATA-NEXT: %11 = neura.grant_predicate %4, %9 : !neura.data<f32, i1>, !neura.data<i1, i1> -> !neura.data<f32, i1> |
| 64 | +// CTRL2DATA-NEXT: %12 = "neura.not"(%9) : (!neura.data<i1, i1>) -> !neura.data<i1, i1> |
| 65 | +// CTRL2DATA-NEXT: %13 = neura.grant_predicate %2, %12 : !neura.data<f32, i1>, !neura.data<i1, i1> -> !neura.data<f32, i1> |
| 66 | +// CTRL2DATA-NEXT: %14 = "neura.not"(%9) : (!neura.data<i1, i1>) -> !neura.data<i1, i1> |
| 67 | +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %5, %14 : !neura.data<f32, i1>, !neura.data<i1, i1> -> !neura.data<f32, i1> |
| 68 | +// CTRL2DATA-NEXT: %16 = "neura.fadd"(%13, %15) : (!neura.data<f32, i1>, !neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 69 | +// CTRL2DATA-NEXT: %17 = "neura.fmul"(%10, %11) : (!neura.data<f32, i1>, !neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 70 | +// CTRL2DATA-NEXT: %18 = "neura.phi"(%16, %17) : (!neura.data<f32, i1>, !neura.data<f32, i1>) -> !neura.data<f32, i1> |
| 71 | +// CTRL2DATA-NEXT: "neura.return"(%18) : (!neura.data<f32, i1>) -> () |
| 72 | +// CTRL2DATA-NEXT: } |
0 commit comments