1cae746d9SJeff Niu// RUN: mlir-opt %s -convert-index-to-llvm | FileCheck %s 2cae746d9SJeff Niu// RUN: mlir-opt %s -convert-index-to-llvm=index-bitwidth=32 | FileCheck %s --check-prefix=INDEX32 3cae746d9SJeff Niu// RUN: mlir-opt %s -convert-index-to-llvm=index-bitwidth=64 | FileCheck %s --check-prefix=INDEX64 4cae746d9SJeff Niu 5bfdc4723SMatthias Springer// Same below, but using the `ConvertToLLVMPatternInterface` entry point 6bfdc4723SMatthias Springer// and the generic `convert-to-llvm` pass. 71fdbbd15SMatthias Springer// RUN: mlir-opt --convert-to-llvm="filter-dialects=index" --split-input-file %s | FileCheck %s 8bfdc4723SMatthias Springer 9cae746d9SJeff Niu// CHECK-LABEL: @trivial_ops 10cae746d9SJeff Niufunc.func @trivial_ops(%a: index, %b: index) { 11cae746d9SJeff Niu // CHECK: llvm.add 12cae746d9SJeff Niu %0 = index.add %a, %b 13cae746d9SJeff Niu // CHECK: llvm.sub 14cae746d9SJeff Niu %1 = index.sub %a, %b 15cae746d9SJeff Niu // CHECK: llvm.mul 16cae746d9SJeff Niu %2 = index.mul %a, %b 17cae746d9SJeff Niu // CHECK: llvm.sdiv 18cae746d9SJeff Niu %3 = index.divs %a, %b 19cae746d9SJeff Niu // CHECK: llvm.udiv 20cae746d9SJeff Niu %4 = index.divu %a, %b 21cae746d9SJeff Niu // CHECK: llvm.srem 22cae746d9SJeff Niu %5 = index.rems %a, %b 23cae746d9SJeff Niu // CHECK: llvm.urem 24cae746d9SJeff Niu %6 = index.remu %a, %b 25cae746d9SJeff Niu // CHECK: llvm.intr.smax 26cae746d9SJeff Niu %7 = index.maxs %a, %b 27cae746d9SJeff Niu // CHECK: llvm.intr.umax 28cae746d9SJeff Niu %8 = index.maxu %a, %b 298cdb4f9fSKrzysztof Drewniak // CHECK: llvm.intr.smin 308cdb4f9fSKrzysztof Drewniak %9 = index.mins %a, %b 318cdb4f9fSKrzysztof Drewniak // CHECK: llvm.intr.umin 328cdb4f9fSKrzysztof Drewniak %10 = index.minu %a, %b 339ef31465SJeff Niu // CHECK: llvm.shl 348cdb4f9fSKrzysztof Drewniak %11 = index.shl %a, %b 359ef31465SJeff Niu // CHECK: llvm.ashr 368cdb4f9fSKrzysztof Drewniak %12 = index.shrs %a, %b 379ef31465SJeff Niu // CHECK: llvm.lshr 388cdb4f9fSKrzysztof Drewniak %13 = index.shru %a, %b 394f9c9295SLuca Boasso // CHECK: llvm.add 408cdb4f9fSKrzysztof Drewniak %14 = index.add %a, %b 414f9c9295SLuca Boasso // CHECK: llvm.or 428cdb4f9fSKrzysztof Drewniak %15 = index.or %a, %b 434f9c9295SLuca Boasso // CHECK: llvm.xor 448cdb4f9fSKrzysztof Drewniak %16 = index.xor %a, %b 45cae746d9SJeff Niu // CHECK: llvm.mlir.constant(true 468cdb4f9fSKrzysztof Drewniak %17 = index.bool.constant true 47cae746d9SJeff Niu return 48cae746d9SJeff Niu} 49cae746d9SJeff Niu 50cae746d9SJeff Niu// CHECK-LABEL: @ceildivs 51cae746d9SJeff Niu// CHECK-SAME: %[[NI:.*]]: index, %[[MI:.*]]: index 52cae746d9SJeff Niufunc.func @ceildivs(%n: index, %m: index) -> index { 53*13d983e7SMatthias Springer // CHECK-DAG: %[[N:.*]] = builtin.unrealized_conversion_cast %[[NI]] 54*13d983e7SMatthias Springer // CHECK-DAG: %[[M:.*]] = builtin.unrealized_conversion_cast %[[MI]] 55cae746d9SJeff Niu // CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : 56cae746d9SJeff Niu // CHECK: %[[POS_ONE:.*]] = llvm.mlir.constant(1 : 57cae746d9SJeff Niu // CHECK: %[[NEG_ONE:.*]] = llvm.mlir.constant(-1 : 58cae746d9SJeff Niu 59cae746d9SJeff Niu // CHECK: %[[M_POS:.*]] = llvm.icmp "sgt" %[[M]], %[[ZERO]] 60cae746d9SJeff Niu // CHECK: %[[X:.*]] = llvm.select %[[M_POS]], %[[NEG_ONE]], %[[POS_ONE]] 61cae746d9SJeff Niu 62cae746d9SJeff Niu // CHECK: %[[N_PLUS_X:.*]] = llvm.add %[[N]], %[[X]] 63cae746d9SJeff Niu // CHECK: %[[N_PLUS_X_DIV_M:.*]] = llvm.sdiv %[[N_PLUS_X]], %[[M]] 64cae746d9SJeff Niu // CHECK: %[[POS_RES:.*]] = llvm.add %[[N_PLUS_X_DIV_M]], %[[POS_ONE]] 65cae746d9SJeff Niu 66cae746d9SJeff Niu // CHECK: %[[NEG_N:.*]] = llvm.sub %[[ZERO]], %[[N]] 67cae746d9SJeff Niu // CHECK: %[[NEG_N_DIV_M:.*]] = llvm.sdiv %[[NEG_N]], %[[M]] 68cae746d9SJeff Niu // CHECK: %[[NEG_RES:.*]] = llvm.sub %[[ZERO]], %[[NEG_N_DIV_M]] 69cae746d9SJeff Niu 70cae746d9SJeff Niu // CHECK: %[[N_POS:.*]] = llvm.icmp "sgt" %[[N]], %[[ZERO]] 71cae746d9SJeff Niu // CHECK: %[[SAME_SIGN:.*]] = llvm.icmp "eq" %[[N_POS]], %[[M_POS]] 72cae746d9SJeff Niu // CHECK: %[[N_NON_ZERO:.*]] = llvm.icmp "ne" %[[N]], %[[ZERO]] 73cae746d9SJeff Niu // CHECK: %[[CMP:.*]] = llvm.and %[[SAME_SIGN]], %[[N_NON_ZERO]] 74cae746d9SJeff Niu // CHECK: %[[RESULT:.*]] = llvm.select %[[CMP]], %[[POS_RES]], %[[NEG_RES]] 75cae746d9SJeff Niu %result = index.ceildivs %n, %m 76cae746d9SJeff Niu 77cae746d9SJeff Niu // CHECK: %[[RESULTI:.*]] = builtin.unrealized_conversion_cast %[[RESULT]] 78cae746d9SJeff Niu // CHECK: return %[[RESULTI]] 79cae746d9SJeff Niu return %result : index 80cae746d9SJeff Niu} 81cae746d9SJeff Niu 82cae746d9SJeff Niu// CHECK-LABEL: @ceildivu 83cae746d9SJeff Niu// CHECK-SAME: %[[NI:.*]]: index, %[[MI:.*]]: index 84cae746d9SJeff Niufunc.func @ceildivu(%n: index, %m: index) -> index { 85*13d983e7SMatthias Springer // CHECK-DAG: %[[N:.*]] = builtin.unrealized_conversion_cast %[[NI]] 86*13d983e7SMatthias Springer // CHECK-DAG: %[[M:.*]] = builtin.unrealized_conversion_cast %[[MI]] 87cae746d9SJeff Niu // CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : 88cae746d9SJeff Niu // CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : 89cae746d9SJeff Niu 90cae746d9SJeff Niu // CHECK: %[[MINUS_ONE:.*]] = llvm.sub %[[N]], %[[ONE]] 91cae746d9SJeff Niu // CHECK: %[[QUOTIENT:.*]] = llvm.udiv %[[MINUS_ONE]], %[[M]] 92cae746d9SJeff Niu // CHECK: %[[PLUS_ONE:.*]] = llvm.add %[[QUOTIENT]], %[[ONE]] 93cae746d9SJeff Niu 94cae746d9SJeff Niu // CHECK: %[[CMP:.*]] = llvm.icmp "eq" %[[N]], %[[ZERO]] 95cae746d9SJeff Niu // CHECK: %[[RESULT:.*]] = llvm.select %[[CMP]], %[[ZERO]], %[[PLUS_ONE]] 96cae746d9SJeff Niu %result = index.ceildivu %n, %m 97cae746d9SJeff Niu 98cae746d9SJeff Niu // CHECK: %[[RESULTI:.*]] = builtin.unrealized_conversion_cast %[[RESULT]] 99cae746d9SJeff Niu // CHECK: return %[[RESULTI]] 100cae746d9SJeff Niu return %result : index 101cae746d9SJeff Niu} 102cae746d9SJeff Niu 103cae746d9SJeff Niu// CHECK-LABEL: @floordivs 104cae746d9SJeff Niu// CHECK-SAME: %[[NI:.*]]: index, %[[MI:.*]]: index 105cae746d9SJeff Niufunc.func @floordivs(%n: index, %m: index) -> index { 106*13d983e7SMatthias Springer // CHECK-DAG: %[[N:.*]] = builtin.unrealized_conversion_cast %[[NI]] 107*13d983e7SMatthias Springer // CHECK-DAG: %[[M:.*]] = builtin.unrealized_conversion_cast %[[MI]] 108*13d983e7SMatthias Springer // CHECK-DAG: %[[ZERO:.*]] = llvm.mlir.constant(0 : 109*13d983e7SMatthias Springer // CHECK-DAG: %[[POS_ONE:.*]] = llvm.mlir.constant(1 : 110*13d983e7SMatthias Springer // CHECK-DAG: %[[NEG_ONE:.*]] = llvm.mlir.constant(-1 : 111cae746d9SJeff Niu 112cae746d9SJeff Niu // CHECK: %[[M_NEG:.*]] = llvm.icmp "slt" %[[M]], %[[ZERO]] 113cae746d9SJeff Niu // CHECK: %[[X:.*]] = llvm.select %[[M_NEG]], %[[POS_ONE]], %[[NEG_ONE]] 114cae746d9SJeff Niu 115cae746d9SJeff Niu // CHECK: %[[X_MINUS_N:.*]] = llvm.sub %[[X]], %[[N]] 116cae746d9SJeff Niu // CHECK: %[[X_MINUS_N_DIV_M:.*]] = llvm.sdiv %[[X_MINUS_N]], %[[M]] 117cae746d9SJeff Niu // CHECK: %[[NEG_RES:.*]] = llvm.sub %[[NEG_ONE]], %[[X_MINUS_N_DIV_M]] 118cae746d9SJeff Niu 119cae746d9SJeff Niu // CHECK: %[[POS_RES:.*]] = llvm.sdiv %[[N]], %[[M]] 120cae746d9SJeff Niu 121cae746d9SJeff Niu // CHECK: %[[N_NEG:.*]] = llvm.icmp "slt" %[[N]], %[[ZERO]] 122cae746d9SJeff Niu // CHECK: %[[DIFF_SIGN:.*]] = llvm.icmp "ne" %[[N_NEG]], %[[M_NEG]] 123cae746d9SJeff Niu // CHECK: %[[N_NON_ZERO:.*]] = llvm.icmp "ne" %[[N]], %[[ZERO]] 124cae746d9SJeff Niu // CHECK: %[[CMP:.*]] = llvm.and %[[DIFF_SIGN]], %[[N_NON_ZERO]] 125cae746d9SJeff Niu // CHECK: %[[RESULT:.*]] = llvm.select %[[CMP]], %[[NEG_RES]], %[[POS_RES]] 126cae746d9SJeff Niu %result = index.floordivs %n, %m 127cae746d9SJeff Niu 128cae746d9SJeff Niu // CHECK: %[[RESULTI:.*]] = builtin.unrealized_conversion_cast %[[RESULT]] 129cae746d9SJeff Niu // CHECK: return %[[RESULTI]] 130cae746d9SJeff Niu return %result : index 131cae746d9SJeff Niu} 132cae746d9SJeff Niu 133cae746d9SJeff Niu// INDEX32-LABEL: @index_cast_from 134cae746d9SJeff Niu// INDEX64-LABEL: @index_cast_from 135cae746d9SJeff Niu// INDEX32-SAME: %[[AI:.*]]: index 136cae746d9SJeff Niu// INDEX64-SAME: %[[AI:.*]]: index 137cae746d9SJeff Niufunc.func @index_cast_from(%a: index) -> (i64, i32, i64, i32) { 138cae746d9SJeff Niu // INDEX32: %[[A:.*]] = builtin.unrealized_conversion_cast %[[AI]] : index to i32 139cae746d9SJeff Niu // INDEX64: %[[A:.*]] = builtin.unrealized_conversion_cast %[[AI]] : index to i64 140cae746d9SJeff Niu 141cae746d9SJeff Niu // INDEX32: %[[V0:.*]] = llvm.sext %[[A]] : i32 to i64 142cae746d9SJeff Niu %0 = index.casts %a : index to i64 143cae746d9SJeff Niu // INDEX64: %[[V1:.*]] = llvm.trunc %[[A]] : i64 to i32 144cae746d9SJeff Niu %1 = index.casts %a : index to i32 145cae746d9SJeff Niu // INDEX32: %[[V2:.*]] = llvm.zext %[[A]] : i32 to i64 146cae746d9SJeff Niu %2 = index.castu %a : index to i64 147cae746d9SJeff Niu // INDEX64: %[[V3:.*]] = llvm.trunc %[[A]] : i64 to i32 148cae746d9SJeff Niu %3 = index.castu %a : index to i32 149cae746d9SJeff Niu 150cae746d9SJeff Niu // INDEX32: return %[[V0]], %[[A]], %[[V2]], %[[A]] 151cae746d9SJeff Niu // INDEX64: return %[[A]], %[[V1]], %[[A]], %[[V3]] 152cae746d9SJeff Niu return %0, %1, %2, %3 : i64, i32, i64, i32 153cae746d9SJeff Niu} 154cae746d9SJeff Niu 155cae746d9SJeff Niu// INDEX32-LABEL: @index_cast_to 156cae746d9SJeff Niu// INDEX64-LABEL: @index_cast_to 157cae746d9SJeff Niu// INDEX32-SAME: %[[A:.*]]: i32, %[[B:.*]]: i64 158cae746d9SJeff Niu// INDEX64-SAME: %[[A:.*]]: i32, %[[B:.*]]: i64 159cae746d9SJeff Niufunc.func @index_cast_to(%a: i32, %b: i64) -> (index, index, index, index) { 160cae746d9SJeff Niu // INDEX64: %[[V0:.*]] = llvm.sext %[[A]] : i32 to i64 161cae746d9SJeff Niu %0 = index.casts %a : i32 to index 162cae746d9SJeff Niu // INDEX32: %[[V1:.*]] = llvm.trunc %[[B]] : i64 to i32 163cae746d9SJeff Niu %1 = index.casts %b : i64 to index 164cae746d9SJeff Niu // INDEX64: %[[V2:.*]] = llvm.zext %[[A]] : i32 to i64 165cae746d9SJeff Niu %2 = index.castu %a : i32 to index 166cae746d9SJeff Niu // INDEX32: %[[V3:.*]] = llvm.trunc %[[B]] : i64 to i32 167cae746d9SJeff Niu %3 = index.castu %b : i64 to index 168cae746d9SJeff Niu return %0, %1, %2, %3 : index, index, index, index 169cae746d9SJeff Niu} 170cae746d9SJeff Niu 171cae746d9SJeff Niu// INDEX32-LABEL: @index_sizeof 172cae746d9SJeff Niu// INDEX64-LABEL: @index_sizeof 173cae746d9SJeff Niufunc.func @index_sizeof() { 174cae746d9SJeff Niu // INDEX32-NEXT: llvm.mlir.constant(32 : i32) 175cae746d9SJeff Niu // INDEX64-NEXT: llvm.mlir.constant(64 : i64) 176cae746d9SJeff Niu %0 = index.sizeof 177cae746d9SJeff Niu return 178cae746d9SJeff Niu} 179cae746d9SJeff Niu 180cae746d9SJeff Niu// INDEX32-LABEL: @index_constant 181cae746d9SJeff Niu// INDEX64-LABEL: @index_constant 182cae746d9SJeff Niufunc.func @index_constant() { 183cae746d9SJeff Niu // INDEX32: llvm.mlir.constant(-2100000000 : i32) : i32 184cae746d9SJeff Niu // INDEX64: llvm.mlir.constant(-2100000000 : i64) : i64 185cae746d9SJeff Niu %0 = index.constant -2100000000 186cae746d9SJeff Niu // INDEX32: llvm.mlir.constant(2100000000 : i32) : i32 187cae746d9SJeff Niu // INDEX64: llvm.mlir.constant(2100000000 : i64) : i64 188cae746d9SJeff Niu %1 = index.constant 2100000000 189cae746d9SJeff Niu // INDEX32: llvm.mlir.constant(1294967296 : i32) : i32 190cae746d9SJeff Niu // INDEX64: llvm.mlir.constant(-3000000000 : i64) : i64 191cae746d9SJeff Niu %2 = index.constant -3000000000 192cae746d9SJeff Niu // INDEX32: llvm.mlir.constant(-1294967296 : i32) : i32 193cae746d9SJeff Niu // INDEX64: llvm.mlir.constant(3000000000 : i64) : i64 194cae746d9SJeff Niu %3 = index.constant 3000000000 195cae746d9SJeff Niu return 196cae746d9SJeff Niu} 197