@@ -262,6 +262,25 @@ func.func @test_crd2idx_dynamic(%c0: i32, %c1: i32) -> i32 {
262262 return %scalar : i32
263263}
264264
265+ // Dynamic crd2idx onto scaled basis strides: the 48 scale of 48E1 must survive lowering,
266+ // i.e. mode 1 of the result is c0*1 + c1*48, not c0 + c1.
267+ // CHECK-LABEL: @test_crd2idx_dynamic_scaled_basis
268+ // CHECK-SAME: (%[[C0:.*]]: i32, %[[C1:.*]]: i32)
269+ func.func @test_crd2idx_dynamic_scaled_basis (%c0: i32 , %c1: i32 ) -> i32 {
270+ %s = fly.make_int_tuple () : () -> !fly.int_tuple <(48 , 21 )>
271+ %d = fly.make_int_tuple () : () -> !fly.int_tuple <(1 E1 , 48 E1 )>
272+ %layout = fly.make_layout (%s , %d ) : (!fly.int_tuple <(48 , 21 )>, !fly.int_tuple <(1 E1 , 48 E1 )>) -> !fly.layout <(48 , 21 ) : (1 E1 , 48 E1 )>
273+ %coord = fly.make_int_tuple (%c0 , %c1 ) : (i32 , i32 ) -> !fly.int_tuple <(?, ?)>
274+ %idx = fly.crd2idx (%coord , %layout ) : (!fly.int_tuple <(?, ?)>, !fly.layout <(48 , 21 ) : (1 E1 , 48 E1 )>) -> !fly.int_tuple <(0 , ?)>
275+ // CHECK: %[[C48:.*]] = arith.constant 48 : i32
276+ // CHECK: %[[MUL:.*]] = arith.muli %[[C1]], %[[C48]] : i32
277+ // CHECK: %[[ADD:.*]] = arith.addi %[[C0]], %[[MUL]] : i32
278+ // CHECK: return %[[ADD]]
279+ %elem = fly.select (%idx ) {indices = array<i32 : 1 >} : (!fly.int_tuple <(0 , ?)>) -> !fly.int_tuple <?>
280+ %scalar = fly.get_scalar (%elem ) : (!fly.int_tuple <?>) -> i32
281+ return %scalar : i32
282+ }
283+
265284// -----
266285
267286// === IntTuple Binary Ops Lowering ===
0 commit comments