@@ -569,15 +569,15 @@ class ConvMatcherBuilder {
569569 }
570570
571571 // / Match body pattern. This should be called last.
572- bool matchBody (bool zeroPointOffset = false ) {
572+ bool matchBody (bool containsZeroPointOffset = false ) {
573573 if (!matched)
574574 return false ;
575575 Block *body = op.getBlock ();
576576 auto yieldOp = cast<linalg::YieldOp>(body->getTerminator ());
577577 switch (poolingType) {
578578 case PoolingType::None:
579579 return bodyMatcherForConvolutionOps (yieldOp.getOperand (0 ), body,
580- zeroPointOffset );
580+ containsZeroPointOffset );
581581 case PoolingType::MaxSigned:
582582 return bodyMatcherForMaxSignedPoolOps (yieldOp.getOperand (0 ), body);
583583 case PoolingType::MaxUnsigned:
@@ -762,7 +762,7 @@ bool isaConvolutionOpOfType<linalg::Conv2DNhwcHwcfQOp>(
762762 /* scalarMap=*/ {},
763763 /* scalarMap=*/ {},
764764 /* outputMap=*/ {N, H, W, F}})
765- .matchBody (/* zeroPointOffset =*/ true );
765+ .matchBody (/* containsZeroPointOffset =*/ true );
766766}
767767
768768// #inputMap = affine_map<(N, H, W, F, h, w, c) -> (N, H + h, W + w, c)>
@@ -825,7 +825,7 @@ bool isaConvolutionOpOfType<linalg::Conv2DNhwcFhwcQOp>(
825825 /* scalarMap=*/ {},
826826 /* scalarMap=*/ {},
827827 /* outputMap=*/ {N, H, W, F}})
828- .matchBody (/* zeroPointOffset =*/ true );
828+ .matchBody (/* containsZeroPointOffset =*/ true );
829829}
830830
831831// #inputMap = affine_map<(N, F, H, W, c, h, w) -> (N, c, H + h, W + w)>
@@ -888,7 +888,7 @@ bool isaConvolutionOpOfType<linalg::Conv2DNchwFchwQOp>(
888888 /* scalarMap=*/ {},
889889 /* scalarMap=*/ {},
890890 /* outputMap=*/ {N, F, H, W}})
891- .matchBody (/* zeroPointOffset =*/ true );
891+ .matchBody (/* containsZeroPointOffset =*/ true );
892892}
893893
894894// #inputMap = affine_map<(N, G, F, H, W, c, h, w) -> (N, G, c, H + h, W + w)>
@@ -987,7 +987,7 @@ bool isaConvolutionOpOfType<linalg::Conv2DNgchwGfchwQOp>(
987987 /* scalarMap=*/ {},
988988 /* scalarMap=*/ {},
989989 /* outputMap=*/ {N, G, F, H, W}})
990- .matchBody (/* zeroPointOffset =*/ true );
990+ .matchBody (/* containsZeroPointOffset =*/ true );
991991}
992992
993993// #inputMap = affine_map<(N, H, W, G, F, h, w, c) -> (N, H + h, W + w, G, c)>
@@ -1054,7 +1054,7 @@ bool isaConvolutionOpOfType<linalg::Conv2DNhwgcGfhwcQOp>(
10541054 /* scalarMap=*/ {},
10551055 /* scalarMap=*/ {},
10561056 /* outputMap=*/ {N, H, W, G, F}})
1057- .matchBody (/* zeroPointOffset =*/ true );
1057+ .matchBody (/* containsZeroPointOffset =*/ true );
10581058}
10591059
10601060// #inputMap = affine_map<(D, H, W, d, h, w) -> (D + d, H + h, W + w)>
@@ -1088,6 +1088,114 @@ bool isaConvolutionOpOfType<linalg::Conv3DOp>(LinalgOp op,
10881088 .matchBody ();
10891089}
10901090
1091+ // #inputMap = affine_map<(N, D, H, W, F, d, h, w, c)
1092+ // -> (N, D + d, H + h, W + w, c)>
1093+ // #filterMap = affine_map<(N, D, H, W, F, d, h, w, c) -> (d, h, w, c, F)>
1094+ // #outputMap = affine_map<(N, D, H, W, F, d, h, w, c) -> (N, D, H, W, F)>
1095+ template <>
1096+ bool isaConvolutionOpOfType<linalg::Conv3DNdhwcDhwcfOp>(
1097+ LinalgOp op, SmallVector<int64_t > *dilations,
1098+ SmallVector<int64_t > *strides) {
1099+ if (isa<linalg::Conv3DNdhwcDhwcfOp>(op))
1100+ return true ;
1101+
1102+ assert (isaConvolutionOpInterface (op) &&
1103+ " expected op to implement ConvolutionOpInterface" );
1104+
1105+ ConvMatcherBuilder m (op, /* spatialRank=*/ 3 , dilations, strides);
1106+ AffineExpr N = m.dim (0 );
1107+ AffineExpr D = m.dim (1 );
1108+ AffineExpr H = m.dim (2 );
1109+ AffineExpr W = m.dim (3 );
1110+ AffineExpr F = m.dim (4 );
1111+ AffineExpr d = m.dim (5 );
1112+ AffineExpr h = m.dim (6 );
1113+ AffineExpr w = m.dim (7 );
1114+ AffineExpr c = m.dim (8 );
1115+
1116+ return m.matchStride (/* iDim=*/ 1 , /* fDim=*/ 0 , /* oDim=*/ 1 , /* idx=*/ 0 )
1117+ .matchStride (/* iDim=*/ 2 , /* fDim=*/ 1 , /* oDim=*/ 2 , /* idx=*/ 1 )
1118+ .matchStride (/* iDim=*/ 3 , /* fDim=*/ 2 , /* oDim=*/ 3 , /* idx=*/ 2 )
1119+ .matchMaps ({/* inputMap=*/ {N, m.strided (D, d, 0 ), m.strided (H, h, 1 ),
1120+ m.strided (W, w, 2 ), c},
1121+ /* filterMap=*/ {d, h, w, c, F},
1122+ /* outputMap=*/ {N, D, H, W, F}})
1123+ .matchBody ();
1124+ }
1125+
1126+ // #inputMap = affine_map<(N, D, H, W, F, d, h, w, c)
1127+ // -> (N, D + d, H + h, W + w, c)>
1128+ // #filterMap = affine_map<(N, D, H, W, F, d, h, w, c) -> (d, h, w, c, F)>
1129+ // #scalarMap = affine_map<(N, D, H, W, F, d, h, w, c) -> ()>
1130+ // #outputMap = affine_map<(N, D, H, W, F, d, h, w, c) -> (N, D, H, W, F)>
1131+ template <>
1132+ bool isaConvolutionOpOfType<linalg::Conv3DNdhwcDhwcfQOp>(
1133+ LinalgOp op, SmallVector<int64_t > *dilations,
1134+ SmallVector<int64_t > *strides) {
1135+ if (isa<linalg::Conv3DNdhwcDhwcfQOp>(op))
1136+ return true ;
1137+
1138+ assert (isaConvolutionOpInterface (op) &&
1139+ " expected op to implement ConvolutionOpInterface" );
1140+
1141+ ConvMatcherBuilder m (op, /* spatialRank=*/ 3 , dilations, strides);
1142+ AffineExpr N = m.dim (0 );
1143+ AffineExpr D = m.dim (1 );
1144+ AffineExpr H = m.dim (2 );
1145+ AffineExpr W = m.dim (3 );
1146+ AffineExpr F = m.dim (4 );
1147+ AffineExpr d = m.dim (5 );
1148+ AffineExpr h = m.dim (6 );
1149+ AffineExpr w = m.dim (7 );
1150+ AffineExpr c = m.dim (8 );
1151+
1152+ return m.matchStride (/* iDim=*/ 1 , /* fDim=*/ 0 , /* oDim=*/ 1 , /* idx=*/ 0 )
1153+ .matchStride (/* iDim=*/ 2 , /* fDim=*/ 1 , /* oDim=*/ 2 , /* idx=*/ 1 )
1154+ .matchStride (/* iDim=*/ 3 , /* fDim=*/ 2 , /* oDim=*/ 3 , /* idx=*/ 2 )
1155+ .matchMaps ({/* inputMap=*/ {N, m.strided (D, d, 0 ), m.strided (H, h, 1 ),
1156+ m.strided (W, w, 2 ), c},
1157+ /* filterMap=*/ {d, h, w, c, F},
1158+ /* scalarMap=*/ {},
1159+ /* scalarMap=*/ {},
1160+ /* outputMap=*/ {N, D, H, W, F}})
1161+ .matchBody (/* containsZeroPointOffset=*/ true );
1162+ }
1163+
1164+ // #inputMap = affine_map<(N, F, D, H, W, c, d, h, w)
1165+ // -> (N, c, D + d, H + h, W + w)>
1166+ // #filterMap = affine_map<(N, F, D, H, W, c, d, h, w) -> (F, c, d, h, w)>
1167+ // #outputMap = affine_map<(N, F, D, H, W, c, d, h, w) -> (N, F, D, H, W)>
1168+ template <>
1169+ bool isaConvolutionOpOfType<linalg::Conv3DNcdhwFcdhwOp>(
1170+ LinalgOp op, SmallVector<int64_t > *dilations,
1171+ SmallVector<int64_t > *strides) {
1172+ if (isa<linalg::Conv3DNcdhwFcdhwOp>(op))
1173+ return true ;
1174+
1175+ assert (isaConvolutionOpInterface (op) &&
1176+ " expected op to implement ConvolutionOpInterface" );
1177+
1178+ ConvMatcherBuilder m (op, /* spatialRank=*/ 3 , dilations, strides);
1179+ AffineExpr N = m.dim (0 );
1180+ AffineExpr F = m.dim (1 );
1181+ AffineExpr D = m.dim (2 );
1182+ AffineExpr H = m.dim (3 );
1183+ AffineExpr W = m.dim (4 );
1184+ AffineExpr c = m.dim (5 );
1185+ AffineExpr d = m.dim (6 );
1186+ AffineExpr h = m.dim (7 );
1187+ AffineExpr w = m.dim (8 );
1188+
1189+ return m.matchStride (/* iDim=*/ 2 , /* fDim=*/ 2 , /* oDim=*/ 2 , /* idx=*/ 0 )
1190+ .matchStride (/* iDim=*/ 3 , /* fDim=*/ 3 , /* oDim=*/ 3 , /* idx=*/ 1 )
1191+ .matchStride (/* iDim=*/ 4 , /* fDim=*/ 4 , /* oDim=*/ 4 , /* idx=*/ 2 )
1192+ .matchMaps ({/* inputMap=*/ {N, c, m.strided (D, d, 0 ), m.strided (H, h, 1 ),
1193+ m.strided (W, w, 2 )},
1194+ /* filterMap=*/ {F, c, d, h, w},
1195+ /* outputMap=*/ {N, F, D, H, W}})
1196+ .matchBody ();
1197+ }
1198+
10911199// #inputMap = affine_map<(N, W, C, w) -> (N, C, W + w)>
10921200// #filterMap = affine_map<(N, W, C, w) -> (C, w)>
10931201// #outputMap = affine_map<(N, W, C, w) -> (N, C, W)>
@@ -1254,7 +1362,7 @@ bool isaConvolutionOpOfType<linalg::DepthwiseConv2DNhwcHwcQOp>(
12541362 /* scalarMap=*/ {},
12551363 /* scalarMap=*/ {},
12561364 /* outputMap=*/ {N, H, W, C}})
1257- .matchBody (/* zeroPointOffset =*/ true );
1365+ .matchBody (/* containsZeroPointOffset =*/ true );
12581366}
12591367
12601368// #inputMap = affine_map<(N, H, W, C, CM, h, w) -> (N, H + h, W + w, C)>
@@ -1317,7 +1425,73 @@ bool isaConvolutionOpOfType<linalg::DepthwiseConv2DNhwcHwcmQOp>(
13171425 /* scalarMap=*/ {},
13181426 /* scalarMap=*/ {},
13191427 /* outputMap=*/ {N, H, W, C, CM}})
1320- .matchBody (/* zeroPointOffset=*/ true );
1428+ .matchBody (/* containsZeroPointOffset=*/ true );
1429+ }
1430+
1431+ // #inputMap = affine_map<(N, D, H, W, d, h, w, C) -> (N, D + d, H + h, W + w, C)>
1432+ // #filterMap = affine_map<(N, D, H, W, d, h, w, C) -> (d, h, w, C)>
1433+ // #outputMap = affine_map<(N, D, H, W, d, h, w, C) -> (N, D, H, W, C)>
1434+ template <>
1435+ bool isaConvolutionOpOfType<linalg::DepthwiseConv3DNdhwcDhwcOp>(
1436+ LinalgOp op, SmallVector<int64_t > *dilations,
1437+ SmallVector<int64_t > *strides) {
1438+ if (isa<linalg::DepthwiseConv3DNdhwcDhwcOp>(op))
1439+ return true ;
1440+
1441+ assert (isaConvolutionOpInterface (op) &&
1442+ " expected op to implement ConvolutionOpInterface" );
1443+
1444+ ConvMatcherBuilder m (op, /* spatialRank=*/ 3 , dilations, strides);
1445+ AffineExpr N = m.dim (0 );
1446+ AffineExpr D = m.dim (1 );
1447+ AffineExpr H = m.dim (2 );
1448+ AffineExpr W = m.dim (3 );
1449+ AffineExpr d = m.dim (4 );
1450+ AffineExpr h = m.dim (5 );
1451+ AffineExpr w = m.dim (6 );
1452+ AffineExpr C = m.dim (7 );
1453+
1454+ return m.matchStride (/* iDim=*/ 1 , /* fDim=*/ 0 , /* oDim=*/ 1 , /* idx=*/ 0 )
1455+ .matchStride (/* iDim=*/ 2 , /* fDim=*/ 1 , /* oDim=*/ 2 , /* idx=*/ 1 )
1456+ .matchStride (/* iDim=*/ 3 , /* fDim=*/ 2 , /* oDim=*/ 3 , /* idx=*/ 2 )
1457+ .matchMaps ({/* inputMap=*/ {N, m.strided (D, d, 0 ), m.strided (H, h, 1 ),
1458+ m.strided (W, w, 2 ), C},
1459+ /* filterMap=*/ {d, h, w, C},
1460+ /* outputMap=*/ {N, D, H, W, C}})
1461+ .matchBody ();
1462+ }
1463+
1464+ // #inputMap = affine_map<(N, D, H, W, d, h, w, C) -> (N, C, D + d, H + h, W + w)>
1465+ // #filterMap = affine_map<(N, D, H, W, d, h, w, C) -> (C, d, h, w)>
1466+ // #outputMap = affine_map<(N, D, H, W, d, h, w, C) -> (N, C, D, H, W)>
1467+ template <>
1468+ bool isaConvolutionOpOfType<linalg::DepthwiseConv3DNcdhwCdhwOp>(
1469+ LinalgOp op, SmallVector<int64_t > *dilations,
1470+ SmallVector<int64_t > *strides) {
1471+ if (isa<linalg::DepthwiseConv3DNcdhwCdhwOp>(op))
1472+ return true ;
1473+
1474+ assert (isaConvolutionOpInterface (op) &&
1475+ " expected op to implement ConvolutionOpInterface" );
1476+
1477+ ConvMatcherBuilder m (op, /* spatialRank=*/ 3 , dilations, strides);
1478+ AffineExpr N = m.dim (0 );
1479+ AffineExpr D = m.dim (1 );
1480+ AffineExpr H = m.dim (2 );
1481+ AffineExpr W = m.dim (3 );
1482+ AffineExpr d = m.dim (4 );
1483+ AffineExpr h = m.dim (5 );
1484+ AffineExpr w = m.dim (6 );
1485+ AffineExpr C = m.dim (7 );
1486+
1487+ return m.matchStride (/* iDim=*/ 2 , /* fDim=*/ 1 , /* oDim=*/ 2 , /* idx=*/ 0 )
1488+ .matchStride (/* iDim=*/ 3 , /* fDim=*/ 2 , /* oDim=*/ 3 , /* idx=*/ 1 )
1489+ .matchStride (/* iDim=*/ 4 , /* fDim=*/ 3 , /* oDim=*/ 4 , /* idx=*/ 2 )
1490+ .matchMaps ({/* inputMap=*/ {N, C, m.strided (D, d, 0 ), m.strided (H, h, 1 ),
1491+ m.strided (W, w, 2 )},
1492+ /* filterMap=*/ {C, d, h, w},
1493+ /* outputMap=*/ {N, C, D, H, W}})
1494+ .matchBody ();
13211495}
13221496
13231497// #inputMap = affine_map<(N, D, H, W, CM, d, h, w, C)
0 commit comments