xref: /llvm-project/mlir/test/Dialect/Index/int-range-inference.mlir (revision 472291111d9135961305afebe4e283e3e4e7eebc)
1*47229111SKrzysztof Drewniak// RUN: mlir-opt -int-range-optimizations -canonicalize %s | FileCheck %s
25af9d16dSKrzysztof Drewniak
35af9d16dSKrzysztof Drewniak// Most operations are covered by the `arith` tests, which use the same code
45af9d16dSKrzysztof Drewniak// Here, we add a few tests to ensure the "index can be 32- or 64-bit" handling
55af9d16dSKrzysztof Drewniak// code is operating as expected.
65af9d16dSKrzysztof Drewniak
75af9d16dSKrzysztof Drewniak// CHECK-LABEL: func @add_same_for_both
85af9d16dSKrzysztof Drewniak// CHECK: %[[true:.*]] = index.bool.constant true
95af9d16dSKrzysztof Drewniak// CHECK: return %[[true]]
105af9d16dSKrzysztof Drewniakfunc.func @add_same_for_both(%arg0 : index) -> i1 {
115af9d16dSKrzysztof Drewniak  %c1 = index.constant 1
125af9d16dSKrzysztof Drewniak  %calmostBig = index.constant 0xfffffffe
135af9d16dSKrzysztof Drewniak  %0 = index.minu %arg0, %calmostBig
145af9d16dSKrzysztof Drewniak  %1 = index.add %0, %c1
155af9d16dSKrzysztof Drewniak  %2 = index.cmp uge(%1, %c1)
165af9d16dSKrzysztof Drewniak  func.return %2 : i1
175af9d16dSKrzysztof Drewniak}
185af9d16dSKrzysztof Drewniak
195af9d16dSKrzysztof Drewniak// CHECK-LABEL: func @add_unsigned_ov
205af9d16dSKrzysztof Drewniak// CHECK: %[[uge:.*]] = index.cmp uge
215af9d16dSKrzysztof Drewniak// CHECK: return %[[uge]]
225af9d16dSKrzysztof Drewniakfunc.func @add_unsigned_ov(%arg0 : index) -> i1 {
235af9d16dSKrzysztof Drewniak  %c1 = index.constant 1
245af9d16dSKrzysztof Drewniak  %cu32_max = index.constant 0xffffffff
255af9d16dSKrzysztof Drewniak  %0 = index.minu %arg0, %cu32_max
265af9d16dSKrzysztof Drewniak  %1 = index.add %0, %c1
275af9d16dSKrzysztof Drewniak  // On 32-bit, the add could wrap, so the result doesn't have to be >= 1
285af9d16dSKrzysztof Drewniak  %2 = index.cmp uge(%1, %c1)
295af9d16dSKrzysztof Drewniak  func.return %2 : i1
305af9d16dSKrzysztof Drewniak}
315af9d16dSKrzysztof Drewniak
325af9d16dSKrzysztof Drewniak// CHECK-LABEL: func @add_signed_ov
335af9d16dSKrzysztof Drewniak// CHECK: %[[sge:.*]] = index.cmp sge
345af9d16dSKrzysztof Drewniak// CHECK: return %[[sge]]
355af9d16dSKrzysztof Drewniakfunc.func @add_signed_ov(%arg0 : index) -> i1 {
365af9d16dSKrzysztof Drewniak  %c0 = index.constant 0
375af9d16dSKrzysztof Drewniak  %c1 = index.constant 1
385af9d16dSKrzysztof Drewniak  %ci32_max = index.constant 0x7fffffff
395af9d16dSKrzysztof Drewniak  %0 = index.minu %arg0, %ci32_max
405af9d16dSKrzysztof Drewniak  %1 = index.add %0, %c1
415af9d16dSKrzysztof Drewniak  // On 32-bit, the add could wrap, so the result doesn't have to be positive
425af9d16dSKrzysztof Drewniak  %2 = index.cmp sge(%1, %c0)
435af9d16dSKrzysztof Drewniak  func.return %2 : i1
445af9d16dSKrzysztof Drewniak}
455af9d16dSKrzysztof Drewniak
465af9d16dSKrzysztof Drewniak// CHECK-LABEL: func @add_big
475af9d16dSKrzysztof Drewniak// CHECK: %[[true:.*]] = index.bool.constant true
485af9d16dSKrzysztof Drewniak// CHECK: return %[[true]]
495af9d16dSKrzysztof Drewniakfunc.func @add_big(%arg0 : index) -> i1 {
505af9d16dSKrzysztof Drewniak  %c1 = index.constant 1
515af9d16dSKrzysztof Drewniak  %cmin = index.constant 0x300000000
525af9d16dSKrzysztof Drewniak  %cmax = index.constant 0x30000ffff
535af9d16dSKrzysztof Drewniak  // Note: the order of the clamps matters.
545af9d16dSKrzysztof Drewniak  // If you go max, then min, you infer the ranges [0x300...0, 0xff..ff]
555af9d16dSKrzysztof Drewniak  // and then [0x30...0000, 0x30...ffff]
565af9d16dSKrzysztof Drewniak  // If you switch the order of the below operations, you instead first infer
575af9d16dSKrzysztof Drewniak  // the range [0,0x3...ffff]. Then, the min inference can't constraint
585af9d16dSKrzysztof Drewniak  // this intermediate, since in the 32-bit case we could have, for example
595af9d16dSKrzysztof Drewniak  // trunc(%arg0 = 0x2ffffffff) = 0xffffffff > trunc(0x30000ffff) = 0x0000ffff
605af9d16dSKrzysztof Drewniak  // which means we can't do any inference.
615af9d16dSKrzysztof Drewniak  %0 = index.maxu %arg0, %cmin
625af9d16dSKrzysztof Drewniak  %1 = index.minu %0, %cmax
635af9d16dSKrzysztof Drewniak  %2 = index.add %1, %c1
645af9d16dSKrzysztof Drewniak  %3 = index.cmp uge(%1, %cmin)
655af9d16dSKrzysztof Drewniak  func.return %3 : i1
665af9d16dSKrzysztof Drewniak}
67