diff --git a/lib/Optimizer/Transforms/LiftArrayAlloc.cpp b/lib/Optimizer/Transforms/LiftArrayAlloc.cpp index 0f7647b579..426ed0ed39 100644 --- a/lib/Optimizer/Transforms/LiftArrayAlloc.cpp +++ b/lib/Optimizer/Transforms/LiftArrayAlloc.cpp @@ -295,6 +295,12 @@ class LiftArrayAllocPass DominanceInfo domInfo(func); StringRef funcName = func.getName(); RewritePatternSet patterns(ctx); + + for (auto *dialect : ctx->getLoadedDialects()) + dialect->getCanonicalizationPatterns(patterns); + for (RegisteredOperationName op : ctx->getRegisteredOperations()) + op.getCanonicalizationPatterns(patterns, ctx); + patterns.insert(ctx, domInfo, funcName); LLVM_DEBUG(llvm::dbgs() diff --git a/test/Quake/lift_array.qke b/test/Quake/lift_array.qke index c93f3631a6..f2cd400b67 100644 --- a/test/Quake/lift_array.qke +++ b/test/Quake/lift_array.qke @@ -159,17 +159,16 @@ func.func @test_two_stores() { } // CHECK-LABEL: func.func @test_two_stores() { -// CHECK: %[[VAL_0:.*]] = arith.constant 0 : i64 -// CHECK: %[[VAL_1:.*]] = quake.alloca !quake.veq<2> -// CHECK: %[[VAL_2:.*]] = cc.const_array [1] : !cc.array -// CHECK: %[[VAL_3:.*]] = cc.extract_value %[[VAL_2]][0] : (!cc.array) -> i64 -// CHECK: %[[VAL_4:.*]] = cc.alloca !cc.array -// CHECK: %[[VAL_5:.*]] = cc.cast %[[VAL_4]] : (!cc.ptr>) -> !cc.ptr -// CHECK: cc.store %[[VAL_0]], %[[VAL_5]] : !cc.ptr -// CHECK: cc.store %[[VAL_3]], %[[VAL_5]] : !cc.ptr -// CHECK: %[[VAL_6:.*]] = cc.load %[[VAL_5]] : !cc.ptr -// CHECK: %[[VAL_7:.*]] = quake.extract_ref %[[VAL_1]][%[[VAL_6]]] : (!quake.veq<2>, i64) -> !quake.ref -// CHECK: quake.x %[[VAL_7]] : (!quake.ref) -> () +// CHECK: %[[VAL_0:.*]] = arith.constant 1 : i64 +// CHECK: %[[VAL_1:.*]] = arith.constant 0 : i64 +// CHECK: %[[VAL_2:.*]] = quake.alloca !quake.veq<2> +// CHECK: %[[VAL_3:.*]] = cc.alloca !cc.array +// CHECK: %[[VAL_4:.*]] = cc.cast %[[VAL_3]] : (!cc.ptr>) -> !cc.ptr +// CHECK: cc.store %[[VAL_1]], %[[VAL_4]] : !cc.ptr +// CHECK: cc.store %[[VAL_0]], %[[VAL_4]] : !cc.ptr +// CHECK: %[[VAL_5:.*]] = cc.load %[[VAL_4]] : !cc.ptr +// CHECK: %[[VAL_6:.*]] = quake.extract_ref %[[VAL_2]][%[[VAL_5]]] : (!quake.veq<2>, i64) -> !quake.ref +// CHECK: quake.x %[[VAL_6]] : (!quake.ref) -> () // CHECK: return // CHECK: } @@ -195,3 +194,23 @@ func.func @test_complex_array() { // CHECK: %[[VAL_4:.*]] = quake.init_state %[[VAL_3]], %[[VAL_2]] : (!quake.veq<1>, !cc.ptr>) -> !quake.veq<1> // CHECK: return // CHECK: } + +func.func @test_array_copy() -> i1 { + %c0_i64 = arith.constant 0 : i64 + %0 = cc.alloca !cc.array + %1 = cc.cast %0 : (!cc.ptr>) -> !cc.ptr + cc.store %c0_i64, %1 : !cc.ptr + %2 = cc.alloca !cc.array + %3 = cc.load %1 : !cc.ptr + %4 = cc.cast %2 : (!cc.ptr>) -> !cc.ptr + cc.store %3, %4 : !cc.ptr + %6 = cc.load %1 : !cc.ptr + %7 = cc.load %4 : !cc.ptr + %8 = arith.cmpi eq, %6, %7 : i64 + return %8 : i1 +} + +// CHECK-LABEL: func.func @test_array_copy() -> i1 { +// CHECK: %[[VAL_0:.*]] = arith.constant true +// CHECK: return %[[VAL_0]] : i1 +// CHECK: }