diff --git a/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td b/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td --- a/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td +++ b/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td @@ -31,22 +31,22 @@ // addi(addi(x, c0), c1) -> addi(x, c0 + c1) def AddIAddConstant : Pat<(Arith_AddIOp:$res - (Arith_AddIOp $x, (Arith_ConstantOp APIntAttr:$c0)), - (Arith_ConstantOp APIntAttr:$c1)), + (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0)), + (ConstantLikeMatcher APIntAttr:$c1)), (Arith_AddIOp $x, (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)))>; // addi(subi(x, c0), c1) -> addi(x, c1 - c0) def AddISubConstantRHS : Pat<(Arith_AddIOp:$res - (Arith_SubIOp $x, (Arith_ConstantOp APIntAttr:$c0)), - (Arith_ConstantOp APIntAttr:$c1)), + (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0)), + (ConstantLikeMatcher APIntAttr:$c1)), (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)))>; // addi(subi(c0, x), c1) -> subi(c0 + c1, x) def AddISubConstantLHS : Pat<(Arith_AddIOp:$res - (Arith_SubIOp (Arith_ConstantOp APIntAttr:$c0), $x), - (Arith_ConstantOp APIntAttr:$c1)), + (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x), + (ConstantLikeMatcher APIntAttr:$c1)), (Arith_SubIOp (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)), $x)>; //===----------------------------------------------------------------------===// @@ -67,43 +67,43 @@ // subi(addi(x, c0), c1) -> addi(x, c0 - c1) def SubIRHSAddConstant : Pat<(Arith_SubIOp:$res - (Arith_AddIOp $x, (Arith_ConstantOp APIntAttr:$c0)), - (Arith_ConstantOp APIntAttr:$c1)), + (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0)), + (ConstantLikeMatcher APIntAttr:$c1)), (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c0, $c1)))>; // subi(c1, addi(x, c0)) -> subi(c1 - c0, x) def SubILHSAddConstant : Pat<(Arith_SubIOp:$res - (Arith_ConstantOp APIntAttr:$c1), - (Arith_AddIOp $x, (Arith_ConstantOp APIntAttr:$c0))), + (ConstantLikeMatcher APIntAttr:$c1), + (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0))), (Arith_SubIOp (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)), $x)>; // subi(subi(x, c0), c1) -> subi(x, c0 + c1) def SubIRHSSubConstantRHS : Pat<(Arith_SubIOp:$res - (Arith_SubIOp $x, (Arith_ConstantOp APIntAttr:$c0)), - (Arith_ConstantOp APIntAttr:$c1)), + (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0)), + (ConstantLikeMatcher APIntAttr:$c1)), (Arith_SubIOp $x, (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)))>; // subi(subi(c0, x), c1) -> subi(c0 - c1, x) def SubIRHSSubConstantLHS : Pat<(Arith_SubIOp:$res - (Arith_SubIOp (Arith_ConstantOp APIntAttr:$c0), $x), - (Arith_ConstantOp APIntAttr:$c1)), + (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x), + (ConstantLikeMatcher APIntAttr:$c1)), (Arith_SubIOp (Arith_ConstantOp (SubIntAttrs $res, $c0, $c1)), $x)>; // subi(c1, subi(x, c0)) -> subi(c0 + c1, x) def SubILHSSubConstantRHS : Pat<(Arith_SubIOp:$res - (Arith_ConstantOp APIntAttr:$c1), - (Arith_SubIOp $x, (Arith_ConstantOp APIntAttr:$c0))), + (ConstantLikeMatcher APIntAttr:$c1), + (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0))), (Arith_SubIOp (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)), $x)>; // subi(c1, subi(c0, x)) -> addi(x, c1 - c0) def SubILHSSubConstantLHS : Pat<(Arith_SubIOp:$res - (Arith_ConstantOp APIntAttr:$c1), - (Arith_SubIOp (Arith_ConstantOp APIntAttr:$c0), $x)), + (ConstantLikeMatcher APIntAttr:$c1), + (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x)), (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)))>; // subi(subi(a, b), a) -> subi(0, b) @@ -145,7 +145,7 @@ def XOrINotCmpI : Pat<(Arith_XOrIOp (Arith_CmpIOp $pred, $a, $b), - (Arith_ConstantOp ConstantAttr)), + (ConstantLikeMatcher ConstantAttr)), (Arith_CmpIOp (InvertPredicate $pred), $a, $b)>; //===----------------------------------------------------------------------===// @@ -159,7 +159,9 @@ (Arith_ExtSIOp $b)), (Arith_CmpIOp $pred, $a, $b), [(Constraint> $a, $b), - (Constraint> $pred)]>; + (Constraint< + CPred<"$0.getValue() == arith::CmpIPredicate::eq || " + "$0.getValue() == arith::CmpIPredicate::ne">> $pred)]>; // cmpi(== or !=, a ext iNN, b ext iNN) == cmpi(== or !=, a, b) def CmpIExtUI : @@ -168,7 +170,9 @@ (Arith_ExtUIOp $b)), (Arith_CmpIOp $pred, $a, $b), [(Constraint> $a, $b), - (Constraint> $pred)]>; + (Constraint< + CPred<"$0.getValue() == arith::CmpIPredicate::eq || " + "$0.getValue() == arith::CmpIPredicate::ne">> $pred)]>; //===----------------------------------------------------------------------===// // IndexCastOp @@ -221,13 +225,15 @@ // and extui(x), extui(y) -> extui(and(x,y)) def AndOfExtUI : - Pat<(Arith_AndIOp (Arith_ExtUIOp $x), (Arith_ExtUIOp $y)), (Arith_ExtUIOp (Arith_AndIOp $x, $y)), - [(Constraint> $x, $y)]>; + Pat<(Arith_AndIOp (Arith_ExtUIOp $x), (Arith_ExtUIOp $y)), + (Arith_ExtUIOp (Arith_AndIOp $x, $y)), + [(Constraint> $x, $y)]>; // and extsi(x), extsi(y) -> extsi(and(x,y)) def AndOfExtSI : - Pat<(Arith_AndIOp (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)), (Arith_ExtSIOp (Arith_AndIOp $x, $y)), - [(Constraint> $x, $y)]>; + Pat<(Arith_AndIOp (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)), + (Arith_ExtSIOp (Arith_AndIOp $x, $y)), + [(Constraint> $x, $y)]>; //===----------------------------------------------------------------------===// // OrIOp @@ -235,13 +241,15 @@ // or extui(x), extui(y) -> extui(or(x,y)) def OrOfExtUI : - Pat<(Arith_OrIOp (Arith_ExtUIOp $x), (Arith_ExtUIOp $y)), (Arith_ExtUIOp (Arith_OrIOp $x, $y)), - [(Constraint> $x, $y)]>; + Pat<(Arith_OrIOp (Arith_ExtUIOp $x), (Arith_ExtUIOp $y)), + (Arith_ExtUIOp (Arith_OrIOp $x, $y)), + [(Constraint> $x, $y)]>; // or extsi(x), extsi(y) -> extsi(or(x,y)) def OrOfExtSI : - Pat<(Arith_OrIOp (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)), (Arith_ExtSIOp (Arith_OrIOp $x, $y)), - [(Constraint> $x, $y)]>; + Pat<(Arith_OrIOp (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)), + (Arith_ExtSIOp (Arith_OrIOp $x, $y)), + [(Constraint> $x, $y)]>; //===----------------------------------------------------------------------===// // MulFOp