1// RUN: mlir-opt -allow-unregistered-dialect %s -affine-super-vectorizer-test=compose-maps -split-input-file 2>&1 | FileCheck %s 2 3// For all these cases, the test traverses the `test_affine_map` ops and 4// composes them in order one-by-one. 5// For instance, the pseudo-sequence: 6// "test_affine_map"() { affine_map = f } : () -> () 7// "test_affine_map"() { affine_map = g } : () -> () 8// "test_affine_map"() { affine_map = h } : () -> () 9// will produce the sequence of compositions: f, g(f), h(g(f)) and print the 10// AffineMap h(g(f)), which is what FileCheck checks against. 11 12func.func @simple1() { 13 // CHECK: Composed map: (d0) -> (d0) 14 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 - 1)> } : () -> () 15 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 + 1)> } : () -> () 16 return 17} 18 19// ----- 20 21func.func @simple2() { 22 // CHECK: Composed map: (d0)[s0, s1] -> (d0 - s0 + s1) 23 "test_affine_map"() { affine_map = affine_map<(d0)[s0] -> (d0 + s0 - 1)> } : () -> () 24 "test_affine_map"() { affine_map = affine_map<(d0)[s0] -> (d0 - s0 + 1)> } : () -> () 25 return 26} 27 28// ----- 29 30func.func @simple3a() { 31 // CHECK: Composed map: (d0, d1)[s0, s1, s2, s3] -> ((d0 ceildiv s2) * s0, (d1 ceildiv s3) * s1) 32 "test_affine_map"() { affine_map = affine_map<(d0, d1)[s0, s1] -> (d0 ceildiv s0, d1 ceildiv s1)> } : () -> () 33 "test_affine_map"() { affine_map = affine_map<(d0, d1)[s0, s1] -> (d0 * s0, d1 * s1)> } : () -> () 34 return 35} 36 37// ----- 38 39func.func @simple3b() { 40 // CHECK: Composed map: (d0, d1)[s0, s1] -> (d0 mod s0, d1 mod s1) 41 "test_affine_map"() { affine_map = affine_map<(d0, d1)[s0, s1] -> (d0 mod s0, d1 mod s1)> } : () -> () 42 return 43} 44 45// ----- 46 47func.func @simple3c() { 48 // CHECK: Composed map: (d0, d1)[s0, s1, s2, s3, s4, s5] -> ((d0 ceildiv s4) * s4 + d0 mod s2, (d1 ceildiv s5) * s5 + d1 mod s3) 49 "test_affine_map"() { affine_map = affine_map<(d0, d1)[s0, s1] -> ((d0 ceildiv s0) * s0, (d1 ceildiv s1) * s1, d0, d1)> } : () -> () 50 "test_affine_map"() { affine_map = affine_map<(d0, d1, d2, d3)[s0, s1, s2, s3] -> (d0 + d2 mod s2, d1 + d3 mod s3)> } : () -> () 51 return 52} 53 54// ----- 55 56func.func @simple4() { 57 // CHECK: Composed map: (d0, d1)[s0, s1] -> (d1 * s1, d0 ceildiv s0) 58 "test_affine_map"() { affine_map = affine_map<(d0, d1) -> (d1, d0)> } : () -> () 59 "test_affine_map"() { affine_map = affine_map<(d0, d1)[s0, s1] -> (d0 * s1, d1 ceildiv s0)> } : () -> () 60 return 61} 62 63// ----- 64 65func.func @simple5a() { 66 // CHECK: Composed map: (d0) -> (d0 * 3 + 18) 67 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 - 1)> } : () -> () 68 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 + 7)> } : () -> () 69 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 * 24)> } : () -> () 70 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 ceildiv 8)> } : () -> () 71 return 72} 73 74// ----- 75 76func.func @simple5b() { 77 // CHECK: Composed map: (d0) -> ((d0 + 6) ceildiv 2) 78 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 - 1)> } : () -> () 79 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 + 7)> } : () -> () 80 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 * 4)> } : () -> () 81 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 ceildiv 8)> } : () -> () 82 return 83} 84 85// ----- 86 87func.func @simple5c() { 88 // CHECK: Composed map: (d0) -> (d0 * 8 + 48) 89 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 - 1)> } : () -> () 90 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 + 7)> } : () -> () 91 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 * 24)> } : () -> () 92 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 floordiv 3)> } : () -> () 93 return 94} 95 96// ----- 97 98func.func @simple5d() { 99 // CHECK: Composed map: (d0) -> ((d0 * 4) floordiv 3 + 8) 100 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 - 1)> } : () -> () 101 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 + 7)> } : () -> () 102 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 * 4)> } : () -> () 103 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 floordiv 3)> } : () -> () 104 return 105} 106 107// ----- 108 109func.func @simple5e() { 110 // CHECK: Composed map: (d0) -> ((d0 + 6) ceildiv 8) 111 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 - 1)> } : () -> () 112 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 + 7)> } : () -> () 113 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 ceildiv 8)> } : () -> () 114 return 115} 116 117// ----- 118 119func.func @simple5f() { 120 // CHECK: Composed map: (d0) -> ((d0 * 4 - 4) floordiv 3) 121 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 - 1)> } : () -> () 122 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 * 4)> } : () -> () 123 "test_affine_map"() { affine_map = affine_map<(d0) -> (d0 floordiv 3)> } : () -> () 124 return 125} 126 127// ----- 128 129func.func @perm_and_proj() { 130 // CHECK: Composed map: (d0, d1, d2, d3) -> (d1, d3, d0) 131 "test_affine_map"() { affine_map = affine_map<(d0, d1, d2, d3) -> (d3, d1, d2, d0)> } : () -> () 132 "test_affine_map"() { affine_map = affine_map<(d0, d1, d2, d3) -> (d1, d0, d3)> } : () -> () 133 return 134} 135 136// ----- 137 138func.func @symbols1() { 139 // CHECK: Composed map: (d0)[s0] -> (d0 + s0 + 1, d0 - s0 - 1) 140 "test_affine_map"() { affine_map = affine_map<(d0)[s0] -> (d0 + s0, d0 - s0)> } : () -> () 141 "test_affine_map"() { affine_map = affine_map<(d0, d1) -> (d0 + 1, d1 - 1)> } : () -> () 142 return 143} 144 145// ----- 146 147func.func @drop() { 148 // CHECK: Composed map: (d0, d1, d2)[s0, s1] -> (d0 * 2 + d1 + d2 + s1) 149 "test_affine_map"() { affine_map = affine_map<(d0, d1, d2)[s0, s1] -> (d0 + s1, d1 + s0, d0 + d1 + d2)> } : () -> () 150 "test_affine_map"() { affine_map = affine_map<(d0, d1, d2) -> (d0 + d2)> } : () -> () 151 return 152} 153 154// ----- 155 156func.func @multi_symbols() { 157 // CHECK: Composed map: (d0)[s0, s1, s2] -> (d0 + s1 + s2 + 1, d0 - s0 - s2 - 1) 158 "test_affine_map"() { affine_map = affine_map<(d0)[s0] -> (d0 + s0, d0 - s0)> } : () -> () 159 "test_affine_map"() { affine_map = affine_map<(d0, d1)[s0, s1] -> (d0 + 1 + s1, d1 - 1 - s0)> } : () -> () 160 return 161} 162 163// ----- 164 165// CHECK-LABEL: @no_affine_maps 166func.func @no_affine_maps() { 167 // CHECK: return 168 return 169} 170