mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 09:16:08 +00:00
[mlir][test] Extend InferIntRangeInterface
test Ops to arbitrary ints (#91850)
This PR is in preparation to some extensions to the `InferIntRangeInterface` around the `nsw` and `nuw` flags supported in the `arith` dialect and LLVM. We provide some common inference logic for `index` and `arith` in `InferIntRangeCommon.h` but our Test Ops are currently fixed to `Index` Types. As we test the range inference for arith Ops, especially around the overflow behaviour, it's handy to have native support for the typical integer types in the test Ops. This patch 1. Changes the Attributes of `test.with_bounds` ops from `Index` to `APInt` which matches the internal representation in `ConstantIntRanges`. 2. Allows the use of `AnyInteger` in addition to `Index` for the operands and results of the test Ops. This now requires explicit specification of the type in the IR, where before `Index` was implicit. 3. Requires bounds Attrs to be specified in the precision of the SSA value, eliminating any implicit truncation or extension. (*Could this lead to problems?*)
This commit is contained in:
parent
19008d3218
commit
acd100747f
@ -756,3 +756,13 @@ func.func private @callee(%arg0: memref<?xindex, 4>) {
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @test_i8_bounds
|
||||
// CHECK: test.reflect_bounds {smax = 127 : i8, smin = -128 : i8, umax = -1 : i8, umin = 0 : i8}
|
||||
func.func @test_i8_bounds() -> i8 {
|
||||
%cst1 = arith.constant 1 : i8
|
||||
%0 = test.with_bounds { umin = 0 : i8, umax = 255 : i8, smin = -128 : i8, smax = 127 : i8 } : i8
|
||||
%1 = arith.addi %0, %cst1 : i8
|
||||
%2 = test.reflect_bounds %1 : i8
|
||||
return %2: i8
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
// CHECK: return %[[C]]
|
||||
func.func @test() -> i1 {
|
||||
%cst1 = arith.constant -1 : index
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index }
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index } : index
|
||||
%1 = arith.cmpi eq, %0, %cst1 : index
|
||||
return %1: i1
|
||||
}
|
||||
@ -17,7 +17,7 @@ func.func @test() -> i1 {
|
||||
// CHECK: return %[[C]]
|
||||
func.func @test() -> i1 {
|
||||
%cst1 = arith.constant -1 : index
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index }
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index } : index
|
||||
%1 = arith.cmpi ne, %0, %cst1 : index
|
||||
return %1: i1
|
||||
}
|
||||
@ -30,7 +30,7 @@ func.func @test() -> i1 {
|
||||
// CHECK: return %[[C]]
|
||||
func.func @test() -> i1 {
|
||||
%cst = arith.constant 0 : index
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index }
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index } : index
|
||||
%1 = arith.cmpi sge, %0, %cst : index
|
||||
return %1: i1
|
||||
}
|
||||
@ -42,7 +42,7 @@ func.func @test() -> i1 {
|
||||
// CHECK: return %[[C]]
|
||||
func.func @test() -> i1 {
|
||||
%cst = arith.constant 0 : index
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index }
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index } : index
|
||||
%1 = arith.cmpi slt, %0, %cst : index
|
||||
return %1: i1
|
||||
}
|
||||
@ -55,7 +55,7 @@ func.func @test() -> i1 {
|
||||
// CHECK: return %[[C]]
|
||||
func.func @test() -> i1 {
|
||||
%cst1 = arith.constant -1 : index
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index }
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index } : index
|
||||
%1 = arith.cmpi sgt, %0, %cst1 : index
|
||||
return %1: i1
|
||||
}
|
||||
@ -67,7 +67,7 @@ func.func @test() -> i1 {
|
||||
// CHECK: return %[[C]]
|
||||
func.func @test() -> i1 {
|
||||
%cst1 = arith.constant -1 : index
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index }
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0x7fffffffffffffff : index, smin = 0 : index, smax = 0x7fffffffffffffff : index } : index
|
||||
%1 = arith.cmpi sle, %0, %cst1 : index
|
||||
return %1: i1
|
||||
}
|
||||
@ -75,28 +75,24 @@ func.func @test() -> i1 {
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @test
|
||||
// CHECK: test.reflect_bounds {smax = 24 : index, smin = 0 : index, umax = 24 : index, umin = 0 : index}
|
||||
func.func @test() -> index {
|
||||
// CHECK: test.reflect_bounds {smax = 24 : i8, smin = 0 : i8, umax = 24 : i8, umin = 0 : i8}
|
||||
func.func @test() -> i8 {
|
||||
%cst1 = arith.constant 1 : i8
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 12 : index, smin = 0 : index, smax = 12 : index }
|
||||
%i8val = arith.index_cast %0 : index to i8
|
||||
%i8val = test.with_bounds { umin = 0 : i8, umax = 12 : i8, smin = 0 : i8, smax = 12 : i8 } : i8
|
||||
%shifted = arith.shli %i8val, %cst1 : i8
|
||||
%si = arith.index_cast %shifted : i8 to index
|
||||
%1 = test.reflect_bounds %si
|
||||
return %1: index
|
||||
%1 = test.reflect_bounds %shifted : i8
|
||||
return %1: i8
|
||||
}
|
||||
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @test
|
||||
// CHECK: test.reflect_bounds {smax = 127 : index, smin = -128 : index, umax = -1 : index, umin = 0 : index}
|
||||
func.func @test() -> index {
|
||||
// CHECK: test.reflect_bounds {smax = 127 : i8, smin = -128 : i8, umax = -1 : i8, umin = 0 : i8}
|
||||
func.func @test() -> i8 {
|
||||
%cst1 = arith.constant 1 : i8
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 127 : index, smin = 0 : index, smax = 127 : index }
|
||||
%i8val = arith.index_cast %0 : index to i8
|
||||
%i8val = test.with_bounds { umin = 0 : i8, umax = 127 : i8, smin = 0 : i8, smax = 127 : i8 } : i8
|
||||
%shifted = arith.shli %i8val, %cst1 : i8
|
||||
%si = arith.index_cast %shifted : i8 to index
|
||||
%1 = test.reflect_bounds %si
|
||||
return %1: index
|
||||
%1 = test.reflect_bounds %shifted : i8
|
||||
return %1: i8
|
||||
}
|
||||
|
||||
|
@ -5,46 +5,46 @@ func.func @launch_func(%arg0 : index) {
|
||||
%0 = test.with_bounds {
|
||||
umin = 3 : index, umax = 5 : index,
|
||||
smin = 3 : index, smax = 5 : index
|
||||
}
|
||||
} : index
|
||||
%1 = test.with_bounds {
|
||||
umin = 7 : index, umax = 11 : index,
|
||||
smin = 7 : index, smax = 11 : index
|
||||
}
|
||||
} : index
|
||||
gpu.launch blocks(%block_id_x, %block_id_y, %block_id_z) in (%grid_dim_x = %0, %grid_dim_y = %1, %grid_dim_z = %arg0)
|
||||
threads(%thread_id_x, %thread_id_y, %thread_id_z) in (%block_dim_x = %arg0, %block_dim_y = %0, %block_dim_z = %1) {
|
||||
|
||||
// CHECK: test.reflect_bounds {smax = 5 : index, smin = 3 : index, umax = 5 : index, umin = 3 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 11 : index, smin = 7 : index, umax = 11 : index, umin = 7 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
%grid_dim_x0 = test.reflect_bounds %grid_dim_x
|
||||
%grid_dim_y0 = test.reflect_bounds %grid_dim_y
|
||||
%grid_dim_z0 = test.reflect_bounds %grid_dim_z
|
||||
%grid_dim_x0 = test.reflect_bounds %grid_dim_x : index
|
||||
%grid_dim_y0 = test.reflect_bounds %grid_dim_y : index
|
||||
%grid_dim_z0 = test.reflect_bounds %grid_dim_z : index
|
||||
|
||||
// CHECK: test.reflect_bounds {smax = 4 : index, smin = 0 : index, umax = 4 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 10 : index, smin = 0 : index, umax = 10 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
%block_id_x0 = test.reflect_bounds %block_id_x
|
||||
%block_id_y0 = test.reflect_bounds %block_id_y
|
||||
%block_id_z0 = test.reflect_bounds %block_id_z
|
||||
%block_id_x0 = test.reflect_bounds %block_id_x : index
|
||||
%block_id_y0 = test.reflect_bounds %block_id_y : index
|
||||
%block_id_z0 = test.reflect_bounds %block_id_z : index
|
||||
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 5 : index, smin = 3 : index, umax = 5 : index, umin = 3 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 11 : index, smin = 7 : index, umax = 11 : index, umin = 7 : index}
|
||||
%block_dim_x0 = test.reflect_bounds %block_dim_x
|
||||
%block_dim_y0 = test.reflect_bounds %block_dim_y
|
||||
%block_dim_z0 = test.reflect_bounds %block_dim_z
|
||||
%block_dim_x0 = test.reflect_bounds %block_dim_x : index
|
||||
%block_dim_y0 = test.reflect_bounds %block_dim_y : index
|
||||
%block_dim_z0 = test.reflect_bounds %block_dim_z : index
|
||||
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4 : index, smin = 0 : index, umax = 4 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 10 : index, smin = 0 : index, umax = 10 : index, umin = 0 : index}
|
||||
%thread_id_x0 = test.reflect_bounds %thread_id_x
|
||||
%thread_id_y0 = test.reflect_bounds %thread_id_y
|
||||
%thread_id_z0 = test.reflect_bounds %thread_id_z
|
||||
%thread_id_x0 = test.reflect_bounds %thread_id_x : index
|
||||
%thread_id_y0 = test.reflect_bounds %thread_id_y : index
|
||||
%thread_id_z0 = test.reflect_bounds %thread_id_z : index
|
||||
|
||||
// The launch bounds are not constant, and so this can't infer anything
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
%thread_id_op = gpu.thread_id y
|
||||
%thread_id_op0 = test.reflect_bounds %thread_id_op
|
||||
%thread_id_op0 = test.reflect_bounds %thread_id_op : index
|
||||
gpu.terminator
|
||||
}
|
||||
|
||||
@ -65,9 +65,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
%grid_dim_x0 = test.reflect_bounds %grid_dim_x
|
||||
%grid_dim_y0 = test.reflect_bounds %grid_dim_y
|
||||
%grid_dim_z0 = test.reflect_bounds %grid_dim_z
|
||||
%grid_dim_x0 = test.reflect_bounds %grid_dim_x : index
|
||||
%grid_dim_y0 = test.reflect_bounds %grid_dim_y : index
|
||||
%grid_dim_z0 = test.reflect_bounds %grid_dim_z : index
|
||||
|
||||
%block_id_x = gpu.block_id x
|
||||
%block_id_y = gpu.block_id y
|
||||
@ -76,9 +76,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
%block_id_x0 = test.reflect_bounds %block_id_x
|
||||
%block_id_y0 = test.reflect_bounds %block_id_y
|
||||
%block_id_z0 = test.reflect_bounds %block_id_z
|
||||
%block_id_x0 = test.reflect_bounds %block_id_x : index
|
||||
%block_id_y0 = test.reflect_bounds %block_id_y : index
|
||||
%block_id_z0 = test.reflect_bounds %block_id_z : index
|
||||
|
||||
%block_dim_x = gpu.block_dim x
|
||||
%block_dim_y = gpu.block_dim y
|
||||
@ -87,9 +87,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
%block_dim_x0 = test.reflect_bounds %block_dim_x
|
||||
%block_dim_y0 = test.reflect_bounds %block_dim_y
|
||||
%block_dim_z0 = test.reflect_bounds %block_dim_z
|
||||
%block_dim_x0 = test.reflect_bounds %block_dim_x : index
|
||||
%block_dim_y0 = test.reflect_bounds %block_dim_y : index
|
||||
%block_dim_z0 = test.reflect_bounds %block_dim_z : index
|
||||
|
||||
%thread_id_x = gpu.thread_id x
|
||||
%thread_id_y = gpu.thread_id y
|
||||
@ -98,9 +98,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
%thread_id_x0 = test.reflect_bounds %thread_id_x
|
||||
%thread_id_y0 = test.reflect_bounds %thread_id_y
|
||||
%thread_id_z0 = test.reflect_bounds %thread_id_z
|
||||
%thread_id_x0 = test.reflect_bounds %thread_id_x : index
|
||||
%thread_id_y0 = test.reflect_bounds %thread_id_y : index
|
||||
%thread_id_z0 = test.reflect_bounds %thread_id_z : index
|
||||
|
||||
%global_id_x = gpu.global_id x
|
||||
%global_id_y = gpu.global_id y
|
||||
@ -109,9 +109,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 9223372036854775807 : index, smin = -9223372036854775808 : index, umax = -8589934592 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 9223372036854775807 : index, smin = -9223372036854775808 : index, umax = -8589934592 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 9223372036854775807 : index, smin = -9223372036854775808 : index, umax = -8589934592 : index, umin = 0 : index}
|
||||
%global_id_x0 = test.reflect_bounds %global_id_x
|
||||
%global_id_y0 = test.reflect_bounds %global_id_y
|
||||
%global_id_z0 = test.reflect_bounds %global_id_z
|
||||
%global_id_x0 = test.reflect_bounds %global_id_x : index
|
||||
%global_id_y0 = test.reflect_bounds %global_id_y : index
|
||||
%global_id_z0 = test.reflect_bounds %global_id_z : index
|
||||
|
||||
%subgroup_size = gpu.subgroup_size : index
|
||||
%lane_id = gpu.lane_id
|
||||
@ -122,10 +122,10 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 127 : index, smin = 0 : index, umax = 127 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
%subgroup_size0 = test.reflect_bounds %subgroup_size
|
||||
%lane_id0 = test.reflect_bounds %lane_id
|
||||
%num_subgroups0 = test.reflect_bounds %num_subgroups
|
||||
%subgroup_id0 = test.reflect_bounds %subgroup_id
|
||||
%subgroup_size0 = test.reflect_bounds %subgroup_size : index
|
||||
%lane_id0 = test.reflect_bounds %lane_id : index
|
||||
%num_subgroups0 = test.reflect_bounds %num_subgroups : index
|
||||
%subgroup_id0 = test.reflect_bounds %subgroup_id : index
|
||||
|
||||
llvm.return
|
||||
}
|
||||
@ -148,9 +148,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 20 : index, smin = 20 : index, umax = 20 : index, umin = 20 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 24 : index, smin = 24 : index, umax = 24 : index, umin = 24 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 28 : index, smin = 28 : index, umax = 28 : index, umin = 28 : index}
|
||||
%grid_dim_x0 = test.reflect_bounds %grid_dim_x
|
||||
%grid_dim_y0 = test.reflect_bounds %grid_dim_y
|
||||
%grid_dim_z0 = test.reflect_bounds %grid_dim_z
|
||||
%grid_dim_x0 = test.reflect_bounds %grid_dim_x : index
|
||||
%grid_dim_y0 = test.reflect_bounds %grid_dim_y : index
|
||||
%grid_dim_z0 = test.reflect_bounds %grid_dim_z : index
|
||||
|
||||
%block_id_x = gpu.block_id x
|
||||
%block_id_y = gpu.block_id y
|
||||
@ -159,9 +159,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 19 : index, smin = 0 : index, umax = 19 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 23 : index, smin = 0 : index, umax = 23 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 27 : index, smin = 0 : index, umax = 27 : index, umin = 0 : index}
|
||||
%block_id_x0 = test.reflect_bounds %block_id_x
|
||||
%block_id_y0 = test.reflect_bounds %block_id_y
|
||||
%block_id_z0 = test.reflect_bounds %block_id_z
|
||||
%block_id_x0 = test.reflect_bounds %block_id_x : index
|
||||
%block_id_y0 = test.reflect_bounds %block_id_y : index
|
||||
%block_id_z0 = test.reflect_bounds %block_id_z : index
|
||||
|
||||
%block_dim_x = gpu.block_dim x
|
||||
%block_dim_y = gpu.block_dim y
|
||||
@ -170,9 +170,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 8 : index, smin = 8 : index, umax = 8 : index, umin = 8 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 12 : index, smin = 12 : index, umax = 12 : index, umin = 12 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 16 : index, smin = 16 : index, umax = 16 : index, umin = 16 : index}
|
||||
%block_dim_x0 = test.reflect_bounds %block_dim_x
|
||||
%block_dim_y0 = test.reflect_bounds %block_dim_y
|
||||
%block_dim_z0 = test.reflect_bounds %block_dim_z
|
||||
%block_dim_x0 = test.reflect_bounds %block_dim_x : index
|
||||
%block_dim_y0 = test.reflect_bounds %block_dim_y : index
|
||||
%block_dim_z0 = test.reflect_bounds %block_dim_z : index
|
||||
|
||||
%thread_id_x = gpu.thread_id x
|
||||
%thread_id_y = gpu.thread_id y
|
||||
@ -181,9 +181,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 7 : index, smin = 0 : index, umax = 7 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 11 : index, smin = 0 : index, umax = 11 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 15 : index, smin = 0 : index, umax = 15 : index, umin = 0 : index}
|
||||
%thread_id_x0 = test.reflect_bounds %thread_id_x
|
||||
%thread_id_y0 = test.reflect_bounds %thread_id_y
|
||||
%thread_id_z0 = test.reflect_bounds %thread_id_z
|
||||
%thread_id_x0 = test.reflect_bounds %thread_id_x : index
|
||||
%thread_id_y0 = test.reflect_bounds %thread_id_y : index
|
||||
%thread_id_z0 = test.reflect_bounds %thread_id_z : index
|
||||
|
||||
%global_id_x = gpu.global_id x
|
||||
%global_id_y = gpu.global_id y
|
||||
@ -192,9 +192,9 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 159 : index, smin = 0 : index, umax = 159 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 287 : index, smin = 0 : index, umax = 287 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 447 : index, smin = 0 : index, umax = 447 : index, umin = 0 : index}
|
||||
%global_id_x0 = test.reflect_bounds %global_id_x
|
||||
%global_id_y0 = test.reflect_bounds %global_id_y
|
||||
%global_id_z0 = test.reflect_bounds %global_id_z
|
||||
%global_id_x0 = test.reflect_bounds %global_id_x : index
|
||||
%global_id_y0 = test.reflect_bounds %global_id_y : index
|
||||
%global_id_z0 = test.reflect_bounds %global_id_z : index
|
||||
|
||||
%subgroup_size = gpu.subgroup_size : index
|
||||
%lane_id = gpu.lane_id
|
||||
@ -205,10 +205,10 @@ module attributes {gpu.container_module} {
|
||||
// CHECK: test.reflect_bounds {smax = 127 : index, smin = 0 : index, umax = 127 : index, umin = 0 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967295 : index, smin = 1 : index, umax = 4294967295 : index, umin = 1 : index}
|
||||
// CHECK: test.reflect_bounds {smax = 4294967294 : index, smin = 0 : index, umax = 4294967294 : index, umin = 0 : index}
|
||||
%subgroup_size0 = test.reflect_bounds %subgroup_size
|
||||
%lane_id0 = test.reflect_bounds %lane_id
|
||||
%num_subgroups0 = test.reflect_bounds %num_subgroups
|
||||
%subgroup_id0 = test.reflect_bounds %subgroup_id
|
||||
%subgroup_size0 = test.reflect_bounds %subgroup_size : index
|
||||
%lane_id0 = test.reflect_bounds %lane_id : index
|
||||
%num_subgroups0 = test.reflect_bounds %num_subgroups : index
|
||||
%subgroup_id0 = test.reflect_bounds %subgroup_id : index
|
||||
|
||||
gpu.return
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
// CHECK: return %[[cst]]
|
||||
func.func @constant() -> index {
|
||||
%0 = test.with_bounds { umin = 3 : index, umax = 3 : index,
|
||||
smin = 3 : index, smax = 3 : index}
|
||||
smin = 3 : index, smax = 3 : index} : index
|
||||
func.return %0 : index
|
||||
}
|
||||
|
||||
@ -13,8 +13,8 @@ func.func @constant() -> index {
|
||||
// CHECK: %[[cst:.*]] = "test.constant"() <{value = 4 : index}
|
||||
// CHECK: return %[[cst]]
|
||||
func.func @increment() -> index {
|
||||
%0 = test.with_bounds { umin = 3 : index, umax = 3 : index, smin = 0 : index, smax = 0x7fffffffffffffff : index }
|
||||
%1 = test.increment %0
|
||||
%0 = test.with_bounds { umin = 3 : index, umax = 3 : index, smin = 0 : index, smax = 0x7fffffffffffffff : index } : index
|
||||
%1 = test.increment %0 : index
|
||||
func.return %1 : index
|
||||
}
|
||||
|
||||
@ -22,14 +22,14 @@ func.func @increment() -> index {
|
||||
// CHECK: test.reflect_bounds {smax = 4 : index, smin = 3 : index, umax = 4 : index, umin = 3 : index}
|
||||
func.func @maybe_increment(%arg0 : i1) -> index {
|
||||
%0 = test.with_bounds { umin = 3 : index, umax = 3 : index,
|
||||
smin = 3 : index, smax = 3 : index}
|
||||
smin = 3 : index, smax = 3 : index} : index
|
||||
%1 = scf.if %arg0 -> index {
|
||||
scf.yield %0 : index
|
||||
} else {
|
||||
%2 = test.increment %0
|
||||
%2 = test.increment %0 : index
|
||||
scf.yield %2 : index
|
||||
}
|
||||
%3 = test.reflect_bounds %1
|
||||
%3 = test.reflect_bounds %1 : index
|
||||
func.return %3 : index
|
||||
}
|
||||
|
||||
@ -37,15 +37,15 @@ func.func @maybe_increment(%arg0 : i1) -> index {
|
||||
// CHECK: test.reflect_bounds {smax = 4 : index, smin = 3 : index, umax = 4 : index, umin = 3 : index}
|
||||
func.func @maybe_increment_br(%arg0 : i1) -> index {
|
||||
%0 = test.with_bounds { umin = 3 : index, umax = 3 : index,
|
||||
smin = 3 : index, smax = 3 : index}
|
||||
smin = 3 : index, smax = 3 : index} : index
|
||||
cf.cond_br %arg0, ^bb0, ^bb1
|
||||
^bb0:
|
||||
%1 = test.increment %0
|
||||
%1 = test.increment %0 : index
|
||||
cf.br ^bb2(%1 : index)
|
||||
^bb1:
|
||||
cf.br ^bb2(%0 : index)
|
||||
^bb2(%2 : index):
|
||||
%3 = test.reflect_bounds %2
|
||||
%3 = test.reflect_bounds %2 : index
|
||||
func.return %3 : index
|
||||
}
|
||||
|
||||
@ -53,16 +53,16 @@ func.func @maybe_increment_br(%arg0 : i1) -> index {
|
||||
// CHECK: test.reflect_bounds {smax = 1 : index, smin = 0 : index, umax = 1 : index, umin = 0 : index}
|
||||
func.func @for_bounds() -> index {
|
||||
%c0 = test.with_bounds { umin = 0 : index, umax = 0 : index,
|
||||
smin = 0 : index, smax = 0 : index}
|
||||
smin = 0 : index, smax = 0 : index} : index
|
||||
%c1 = test.with_bounds { umin = 1 : index, umax = 1 : index,
|
||||
smin = 1 : index, smax = 1 : index}
|
||||
smin = 1 : index, smax = 1 : index} : index
|
||||
%c2 = test.with_bounds { umin = 2 : index, umax = 2 : index,
|
||||
smin = 2 : index, smax = 2 : index}
|
||||
smin = 2 : index, smax = 2 : index} : index
|
||||
|
||||
%0 = scf.for %arg0 = %c0 to %c2 step %c1 iter_args(%arg2 = %c0) -> index {
|
||||
scf.yield %arg0 : index
|
||||
}
|
||||
%1 = test.reflect_bounds %0
|
||||
%1 = test.reflect_bounds %0 : index
|
||||
func.return %1 : index
|
||||
}
|
||||
|
||||
@ -70,17 +70,17 @@ func.func @for_bounds() -> index {
|
||||
// CHECK: test.reflect_bounds {smax = 9223372036854775807 : index, smin = -9223372036854775808 : index, umax = -1 : index, umin = 0 : index}
|
||||
func.func @no_analysis_of_loop_variants() -> index {
|
||||
%c0 = test.with_bounds { umin = 0 : index, umax = 0 : index,
|
||||
smin = 0 : index, smax = 0 : index}
|
||||
smin = 0 : index, smax = 0 : index} : index
|
||||
%c1 = test.with_bounds { umin = 1 : index, umax = 1 : index,
|
||||
smin = 1 : index, smax = 1 : index}
|
||||
smin = 1 : index, smax = 1 : index} : index
|
||||
%c2 = test.with_bounds { umin = 2 : index, umax = 2 : index,
|
||||
smin = 2 : index, smax = 2 : index}
|
||||
smin = 2 : index, smax = 2 : index} : index
|
||||
|
||||
%0 = scf.for %arg0 = %c0 to %c2 step %c1 iter_args(%arg2 = %c0) -> index {
|
||||
%1 = test.increment %arg2
|
||||
%1 = test.increment %arg2 : index
|
||||
scf.yield %1 : index
|
||||
}
|
||||
%2 = test.reflect_bounds %0
|
||||
%2 = test.reflect_bounds %0 : index
|
||||
func.return %2 : index
|
||||
}
|
||||
|
||||
@ -88,8 +88,8 @@ func.func @no_analysis_of_loop_variants() -> index {
|
||||
// CHECK: test.reflect_bounds {smax = 4 : index, smin = 3 : index, umax = 4 : index, umin = 3 : index}
|
||||
func.func @region_args() {
|
||||
test.with_bounds_region { umin = 3 : index, umax = 4 : index,
|
||||
smin = 3 : index, smax = 4 : index } %arg0 {
|
||||
%0 = test.reflect_bounds %arg0
|
||||
smin = 3 : index, smax = 4 : index } %arg0 : index {
|
||||
%0 = test.reflect_bounds %arg0 : index
|
||||
}
|
||||
func.return
|
||||
}
|
||||
@ -97,7 +97,7 @@ func.func @region_args() {
|
||||
// CHECK-LABEL: func @func_args_unbound
|
||||
// CHECK: test.reflect_bounds {smax = 9223372036854775807 : index, smin = -9223372036854775808 : index, umax = -1 : index, umin = 0 : index}
|
||||
func.func @func_args_unbound(%arg0 : index) -> index {
|
||||
%0 = test.reflect_bounds %arg0
|
||||
%0 = test.reflect_bounds %arg0 : index
|
||||
func.return %0 : index
|
||||
}
|
||||
|
||||
@ -106,7 +106,7 @@ func.func @propagate_across_while_loop_false() -> index {
|
||||
// CHECK-DAG: %[[C0:.*]] = "test.constant"() <{value = 0
|
||||
// CHECK-DAG: %[[C1:.*]] = "test.constant"() <{value = 1
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0 : index,
|
||||
smin = 0 : index, smax = 0 : index }
|
||||
smin = 0 : index, smax = 0 : index } : index
|
||||
%1 = scf.while : () -> index {
|
||||
%false = arith.constant false
|
||||
// CHECK: scf.condition(%{{.*}}) %[[C0]]
|
||||
@ -116,7 +116,7 @@ func.func @propagate_across_while_loop_false() -> index {
|
||||
scf.yield
|
||||
}
|
||||
// CHECK: return %[[C1]]
|
||||
%2 = test.increment %1
|
||||
%2 = test.increment %1 : index
|
||||
return %2 : index
|
||||
}
|
||||
|
||||
@ -125,7 +125,7 @@ func.func @propagate_across_while_loop(%arg0 : i1) -> index {
|
||||
// CHECK-DAG: %[[C0:.*]] = "test.constant"() <{value = 0
|
||||
// CHECK-DAG: %[[C1:.*]] = "test.constant"() <{value = 1
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0 : index,
|
||||
smin = 0 : index, smax = 0 : index }
|
||||
smin = 0 : index, smax = 0 : index } : index
|
||||
%1 = scf.while : () -> index {
|
||||
// CHECK: scf.condition(%{{.*}}) %[[C0]]
|
||||
scf.condition(%arg0) %0 : index
|
||||
@ -134,7 +134,7 @@ func.func @propagate_across_while_loop(%arg0 : i1) -> index {
|
||||
scf.yield
|
||||
}
|
||||
// CHECK: return %[[C1]]
|
||||
%2 = test.increment %1
|
||||
%2 = test.increment %1 : index
|
||||
return %2 : index
|
||||
}
|
||||
|
||||
@ -142,7 +142,7 @@ func.func @propagate_across_while_loop(%arg0 : i1) -> index {
|
||||
func.func @dont_propagate_across_infinite_loop() -> index {
|
||||
// CHECK: %[[C0:.*]] = "test.constant"() <{value = 0
|
||||
%0 = test.with_bounds { umin = 0 : index, umax = 0 : index,
|
||||
smin = 0 : index, smax = 0 : index }
|
||||
smin = 0 : index, smax = 0 : index } : index
|
||||
// CHECK: %[[loopRes:.*]] = scf.while
|
||||
%1 = scf.while : () -> index {
|
||||
%true = arith.constant true
|
||||
@ -152,8 +152,8 @@ func.func @dont_propagate_across_infinite_loop() -> index {
|
||||
^bb0(%i1: index):
|
||||
scf.yield
|
||||
}
|
||||
// CHECK: %[[ret:.*]] = test.reflect_bounds %[[loopRes]]
|
||||
%2 = test.reflect_bounds %1
|
||||
// CHECK: %[[ret:.*]] = test.reflect_bounds %[[loopRes]] : index
|
||||
%2 = test.reflect_bounds %1 : index
|
||||
// CHECK: return %[[ret]]
|
||||
return %2 : index
|
||||
}
|
||||
|
@ -663,8 +663,7 @@ ParseResult TestWithBoundsRegionOp::parse(OpAsmParser &parser,
|
||||
|
||||
// Parse the input argument
|
||||
OpAsmParser::Argument argInfo;
|
||||
argInfo.type = parser.getBuilder().getIndexType();
|
||||
if (failed(parser.parseArgument(argInfo)))
|
||||
if (failed(parser.parseArgument(argInfo, true)))
|
||||
return failure();
|
||||
|
||||
// Parse the body region, and reuse the operand info as the argument info.
|
||||
@ -676,7 +675,7 @@ void TestWithBoundsRegionOp::print(OpAsmPrinter &p) {
|
||||
p.printOptionalAttrDict((*this)->getAttrs());
|
||||
p << ' ';
|
||||
p.printRegionArgument(getRegion().getArgument(0), /*argAttrs=*/{},
|
||||
/*omitType=*/true);
|
||||
/*omitType=*/false);
|
||||
p << ' ';
|
||||
p.printRegion(getRegion(), /*printEntryBlockArgs=*/false);
|
||||
}
|
||||
@ -707,10 +706,11 @@ void TestReflectBoundsOp::inferResultRanges(
|
||||
const ConstantIntRanges &range = argRanges[0];
|
||||
MLIRContext *ctx = getContext();
|
||||
Builder b(ctx);
|
||||
setUminAttr(b.getIndexAttr(range.umin().getZExtValue()));
|
||||
setUmaxAttr(b.getIndexAttr(range.umax().getZExtValue()));
|
||||
setSminAttr(b.getIndexAttr(range.smin().getSExtValue()));
|
||||
setSmaxAttr(b.getIndexAttr(range.smax().getSExtValue()));
|
||||
auto intTy = getType();
|
||||
setUminAttr(b.getIntegerAttr(intTy, range.umin()));
|
||||
setUmaxAttr(b.getIntegerAttr(intTy, range.umax()));
|
||||
setSminAttr(b.getIntegerAttr(intTy, range.smin()));
|
||||
setSmaxAttr(b.getIntegerAttr(intTy, range.smax()));
|
||||
setResultRanges(getResult(), range);
|
||||
}
|
||||
|
||||
|
@ -2734,49 +2734,51 @@ def TestGraphLoopOp : TEST_Op<"graph_loop",
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Test InferIntRangeInterface
|
||||
//===----------------------------------------------------------------------===//
|
||||
def InferIntRangeType : AnyTypeOf<[AnyInteger, Index]>;
|
||||
|
||||
def TestWithBoundsOp : TEST_Op<"with_bounds",
|
||||
[DeclareOpInterfaceMethods<InferIntRangeInterface>,
|
||||
NoMemoryEffect]> {
|
||||
let arguments = (ins IndexAttr:$umin,
|
||||
IndexAttr:$umax,
|
||||
IndexAttr:$smin,
|
||||
IndexAttr:$smax);
|
||||
let results = (outs Index:$fakeVal);
|
||||
let arguments = (ins APIntAttr:$umin,
|
||||
APIntAttr:$umax,
|
||||
APIntAttr:$smin,
|
||||
APIntAttr:$smax);
|
||||
let results = (outs InferIntRangeType:$fakeVal);
|
||||
|
||||
let assemblyFormat = "attr-dict";
|
||||
let assemblyFormat = "attr-dict `:` type($fakeVal)";
|
||||
}
|
||||
|
||||
def TestWithBoundsRegionOp : TEST_Op<"with_bounds_region",
|
||||
[DeclareOpInterfaceMethods<InferIntRangeInterface>,
|
||||
SingleBlock, NoTerminator]> {
|
||||
let arguments = (ins IndexAttr:$umin,
|
||||
IndexAttr:$umax,
|
||||
IndexAttr:$smin,
|
||||
IndexAttr:$smax);
|
||||
// The region has one argument of index type
|
||||
let arguments = (ins APIntAttr:$umin,
|
||||
APIntAttr:$umax,
|
||||
APIntAttr:$smin,
|
||||
APIntAttr:$smax);
|
||||
// The region has one argument of any integer type
|
||||
let regions = (region SizedRegion<1>:$region);
|
||||
let hasCustomAssemblyFormat = 1;
|
||||
}
|
||||
|
||||
def TestIncrementOp : TEST_Op<"increment",
|
||||
[DeclareOpInterfaceMethods<InferIntRangeInterface>,
|
||||
NoMemoryEffect]> {
|
||||
let arguments = (ins Index:$value);
|
||||
let results = (outs Index:$result);
|
||||
NoMemoryEffect, AllTypesMatch<["value", "result"]>]> {
|
||||
let arguments = (ins InferIntRangeType:$value);
|
||||
let results = (outs InferIntRangeType:$result);
|
||||
|
||||
let assemblyFormat = "attr-dict $value";
|
||||
let assemblyFormat = "attr-dict $value `:` type($result)";
|
||||
}
|
||||
|
||||
def TestReflectBoundsOp : TEST_Op<"reflect_bounds",
|
||||
[DeclareOpInterfaceMethods<InferIntRangeInterface>]> {
|
||||
let arguments = (ins Index:$value,
|
||||
OptionalAttr<IndexAttr>:$umin,
|
||||
OptionalAttr<IndexAttr>:$umax,
|
||||
OptionalAttr<IndexAttr>:$smin,
|
||||
OptionalAttr<IndexAttr>:$smax);
|
||||
let results = (outs Index:$result);
|
||||
[DeclareOpInterfaceMethods<InferIntRangeInterface>, AllTypesMatch<["value", "result"]>]> {
|
||||
let arguments = (ins InferIntRangeType:$value,
|
||||
OptionalAttr<APIntAttr>:$umin,
|
||||
OptionalAttr<APIntAttr>:$umax,
|
||||
OptionalAttr<APIntAttr>:$smin,
|
||||
OptionalAttr<APIntAttr>:$smax);
|
||||
let results = (outs InferIntRangeType:$result);
|
||||
|
||||
let assemblyFormat = "attr-dict $value";
|
||||
let assemblyFormat = "attr-dict $value `:` type($result)";
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Loading…
x
Reference in New Issue
Block a user