|
| 1 | +// RUN: triton-shared-opt --tptr-to-llvm %s | FileCheck %s |
| 2 | + |
| 3 | +module { |
| 4 | + llvm.func @simple_cf_ptradd(%arg0: i64, %arg1: !llvm.ptr, %arg2: i64, %arg3: !llvm.ptr, %arg4: i64, %arg5: !llvm.ptr, %arg6: i32, %arg7: i32, %arg8: i32, %arg9: i32, %arg10: i32, %arg11: i32) { |
| 5 | + %0 = llvm.mlir.poison : !llvm.struct<(i64, ptr)> |
| 6 | + %1 = llvm.insertvalue %arg4, %0[0] : !llvm.struct<(i64, ptr)> |
| 7 | + %2 = llvm.insertvalue %arg5, %1[1] : !llvm.struct<(i64, ptr)> |
| 8 | + %3 = builtin.unrealized_conversion_cast %2 : !llvm.struct<(i64, ptr)> to memref<*xf32> |
| 9 | + %4 = llvm.mlir.poison : !llvm.struct<(i64, ptr)> |
| 10 | + %5 = llvm.insertvalue %arg2, %4[0] : !llvm.struct<(i64, ptr)> |
| 11 | + %6 = llvm.insertvalue %arg3, %5[1] : !llvm.struct<(i64, ptr)> |
| 12 | + %7 = builtin.unrealized_conversion_cast %6 : !llvm.struct<(i64, ptr)> to memref<*xi64> |
| 13 | + %8 = llvm.mlir.poison : !llvm.struct<(i64, ptr)> |
| 14 | + %9 = llvm.insertvalue %arg0, %8[0] : !llvm.struct<(i64, ptr)> |
| 15 | + %10 = llvm.insertvalue %arg1, %9[1] : !llvm.struct<(i64, ptr)> |
| 16 | + %11 = builtin.unrealized_conversion_cast %10 : !llvm.struct<(i64, ptr)> to memref<*xi64> |
| 17 | + %12 = builtin.unrealized_conversion_cast %11 : memref<*xi64> to !llvm.struct<(i64, ptr)> |
| 18 | + %13 = builtin.unrealized_conversion_cast %7 : memref<*xi64> to !llvm.struct<(i64, ptr)> |
| 19 | + %14 = builtin.unrealized_conversion_cast %3 : memref<*xf32> to !llvm.struct<(i64, ptr)> |
| 20 | + %15 = llvm.mlir.constant(0 : i32) : i32 |
| 21 | + %16 = llvm.mlir.constant(2 : i32) : i32 |
| 22 | + %17 = llvm.mlir.constant(3 : i32) : i32 |
| 23 | + %18 = llvm.mlir.constant(0 : index) : i64 |
| 24 | + %19 = llvm.extractvalue %14[1] : !llvm.struct<(i64, ptr)> |
| 25 | + %20 = llvm.load %19 : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 26 | + %21 = builtin.unrealized_conversion_cast %20 : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> to memref<1xf32> |
| 27 | + %22 = tptr.from_memref %21 : memref<1xf32> to !tt.ptr<f32> |
| 28 | + %23 = llvm.extractvalue %13[1] : !llvm.struct<(i64, ptr)> |
| 29 | + %24 = llvm.load %23 : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 30 | + %25 = builtin.unrealized_conversion_cast %24 : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> to memref<1xi64> |
| 31 | + %26 = tptr.from_memref %25 : memref<1xi64> to !tt.ptr<i64> |
| 32 | + %27 = llvm.extractvalue %12[1] : !llvm.struct<(i64, ptr)> |
| 33 | + %28 = llvm.load %27 : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 34 | + %29 = builtin.unrealized_conversion_cast %28 : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> to memref<1xi64> |
| 35 | + %30 = tptr.from_memref %29 : memref<1xi64> to !tt.ptr<i64> |
| 36 | + %31 = llvm.srem %arg9, %16 : i32 |
| 37 | + %32 = llvm.icmp "eq" %31, %15 : i32 |
| 38 | + cf.cond_br %32, ^bb1(%30, %16 : !tt.ptr<i64>, i32), ^bb1(%26, %17 : !tt.ptr<i64>, i32) |
| 39 | + ^bb1(%33: !tt.ptr<i64>, %34: i32): // 2 preds: ^bb0, ^bb0 |
| 40 | + %35 = tptr.ptradd %33 %34 : !tt.ptr<i64>, i32 to !tt.ptr<i64> |
| 41 | + cf.br ^bb2 |
| 42 | + ^bb2: // pred: ^bb1 |
| 43 | + cf.br ^bb3 |
| 44 | + ^bb3: // pred: ^bb2 |
| 45 | + %36 = tptr.ptradd %35 %arg9 : !tt.ptr<i64>, i32 to !tt.ptr<i64> |
| 46 | + %37 = tptr.to_memref %36 : !tt.ptr<i64> to memref<1xi64> |
| 47 | + %38 = builtin.unrealized_conversion_cast %37 : memref<1xi64> to !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 48 | + %39 = llvm.extractvalue %38[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 49 | + %40 = llvm.getelementptr inbounds|nuw %39[%18] : (!llvm.ptr, i64) -> !llvm.ptr, i64 |
| 50 | + %41 = llvm.load %40 : !llvm.ptr -> i64 |
| 51 | + %42 = tptr.ptradd %22 %arg9 : !tt.ptr<f32>, i32 to !tt.ptr<f32> |
| 52 | + %43 = llvm.sitofp %41 : i64 to f32 |
| 53 | + %44 = tptr.to_memref %42 : !tt.ptr<f32> to memref<1xf32> |
| 54 | + %45 = builtin.unrealized_conversion_cast %44 : memref<1xf32> to !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 55 | + %46 = llvm.extractvalue %45[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 56 | + %47 = llvm.getelementptr inbounds|nuw %46[%18] : (!llvm.ptr, i64) -> !llvm.ptr, f32 |
| 57 | + llvm.store %43, %47 : f32, !llvm.ptr |
| 58 | + llvm.return |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | + |
| 63 | +// NOTE: Assertions have been autogenerated by utils/generate-test-checks.py |
| 64 | + |
| 65 | +// The script is designed to make adding checks to |
| 66 | +// a test case fast, it is *not* designed to be authoritative |
| 67 | +// about what constitutes a good test! The CHECK should be |
| 68 | +// minimized and named to reflect the test intent. |
| 69 | + |
| 70 | +// CHECK-LABEL: llvm.func @simple_cf_ptradd( |
| 71 | +// CHECK-SAME: %[[VAL_0:.*]]: i64, %[[VAL_1:.*]]: !llvm.ptr, %[[VAL_2:.*]]: i64, %[[VAL_3:.*]]: !llvm.ptr, %[[VAL_4:.*]]: i64, %[[VAL_5:.*]]: !llvm.ptr, %[[VAL_6:.*]]: i32, %[[VAL_7:.*]]: i32, %[[VAL_8:.*]]: i32, %[[VAL_9:.*]]: i32, %[[VAL_10:.*]]: i32, %[[VAL_11:.*]]: i32) { |
| 72 | +// CHECK: %[[VAL_12:.*]] = llvm.mlir.constant(3 : i32) : i32 |
| 73 | +// CHECK: %[[VAL_13:.*]] = llvm.mlir.constant(2 : i32) : i32 |
| 74 | +// CHECK: %[[VAL_14:.*]] = llvm.mlir.constant(0 : i32) : i32 |
| 75 | +// CHECK: %[[VAL_15:.*]] = llvm.load %[[VAL_5]] : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 76 | +// CHECK: %[[VAL_16:.*]] = llvm.extractvalue %[[VAL_15]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 77 | +// CHECK: %[[VAL_17:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 78 | +// CHECK: %[[VAL_18:.*]] = llvm.extractvalue %[[VAL_17]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 79 | +// CHECK: %[[VAL_19:.*]] = llvm.load %[[VAL_1]] : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 80 | +// CHECK: %[[VAL_20:.*]] = llvm.extractvalue %[[VAL_19]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> |
| 81 | +// CHECK: %[[VAL_21:.*]] = llvm.srem %[[VAL_9]], %[[VAL_13]] : i32 |
| 82 | +// CHECK: %[[VAL_22:.*]] = llvm.icmp "eq" %[[VAL_21]], %[[VAL_14]] : i32 |
| 83 | +// CHECK: %[[VAL_23:.*]] = arith.select %[[VAL_22]], %[[VAL_20]], %[[VAL_18]] : !llvm.ptr |
| 84 | +// CHECK: %[[VAL_24:.*]] = arith.select %[[VAL_22]], %[[VAL_13]], %[[VAL_12]] : i32 |
| 85 | +// CHECK: %[[VAL_25:.*]] = llvm.getelementptr %[[VAL_23]]{{\[}}%[[VAL_24]]] : (!llvm.ptr, i32) -> !llvm.ptr, i64 |
| 86 | +// CHECK: %[[VAL_26:.*]] = llvm.getelementptr %[[VAL_25]]{{\[}}%[[VAL_9]]] : (!llvm.ptr, i32) -> !llvm.ptr, i64 |
| 87 | +// CHECK: %[[VAL_27:.*]] = llvm.load %[[VAL_26]] : !llvm.ptr -> i64 |
| 88 | +// CHECK: %[[VAL_28:.*]] = llvm.getelementptr %[[VAL_16]]{{\[}}%[[VAL_9]]] : (!llvm.ptr, i32) -> !llvm.ptr, f32 |
| 89 | +// CHECK: %[[VAL_29:.*]] = llvm.sitofp %[[VAL_27]] : i64 to f32 |
| 90 | +// CHECK: llvm.store %[[VAL_29]], %[[VAL_28]] : f32, !llvm.ptr |
| 91 | +// CHECK: llvm.return |
| 92 | +// CHECK: } |
| 93 | + |
0 commit comments