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