xref: /llvm-project/mlir/test/Conversion/IndexToLLVM/index-to-llvm.mlir (revision 13d983e730297ad454d53a0a97e1f72499b489f1)
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