// RUN: mlir-opt -canonicalize %s | FileCheck %s #ntt_poly = #polynomial.int_polynomial<-1 + x**8> #ntt_ring = #polynomial.ring #root = #polynomial.primitive_root !ntt_poly_ty = !polynomial.polynomial !tensor_ty = tensor<8xi32, #ntt_ring> // CHECK-LABEL: @test_canonicalize_intt_after_ntt // CHECK: (%[[P:.*]]: [[T:.*]]) -> [[T]] func.func @test_canonicalize_intt_after_ntt(%p0 : !ntt_poly_ty) -> !ntt_poly_ty { // CHECK-NOT: polynomial.ntt // CHECK-NOT: polynomial.intt // CHECK: %[[RESULT:.+]] = polynomial.add %[[P]], %[[P]] : [[T]] %t0 = polynomial.ntt %p0 {root=#root} : !ntt_poly_ty -> !tensor_ty %p1 = polynomial.intt %t0 {root=#root} : !tensor_ty -> !ntt_poly_ty %p2 = polynomial.add %p1, %p1 : !ntt_poly_ty // CHECK: return %[[RESULT]] : [[T]] return %p2 : !ntt_poly_ty } // CHECK-LABEL: @test_canonicalize_ntt_after_intt // CHECK: (%[[X:.*]]: [[T:.*]]) -> [[T]] func.func @test_canonicalize_ntt_after_intt(%t0 : !tensor_ty) -> !tensor_ty { // CHECK-NOT: polynomial.intt // CHECK-NOT: polynomial.ntt // CHECK: %[[RESULT:.+]] = arith.addi %[[X]], %[[X]] : [[T]] %p0 = polynomial.intt %t0 {root=#root} : !tensor_ty -> !ntt_poly_ty %t1 = polynomial.ntt %p0 {root=#root} : !ntt_poly_ty -> !tensor_ty %t2 = arith.addi %t1, %t1 : !tensor_ty // CHECK: return %[[RESULT]] : [[T]] return %t2 : !tensor_ty } #cycl_2048 = #polynomial.int_polynomial<1 + x**1024> #ring = #polynomial.ring !sub_ty = !polynomial.polynomial // CHECK-LABEL: test_canonicalize_sub // CHECK-SAME: (%[[p0:.*]]: [[T:.*]], %[[p1:.*]]: [[T]]) -> [[T]] { func.func @test_canonicalize_sub(%poly0 : !sub_ty, %poly1 : !sub_ty) -> !sub_ty { %0 = polynomial.sub %poly0, %poly1 : !sub_ty // CHECK: %[[minus_one:.+]] = arith.constant -1 : i32 // CHECK: %[[p1neg:.+]] = polynomial.mul_scalar %[[p1]], %[[minus_one]] // CHECK: [[ADD:%.+]] = polynomial.add %[[p0]], %[[p1neg]] return %0 : !sub_ty }