@@ -30,58 +30,80 @@ def cost(thetas: np.ndarray): # can pass 1D ndarray or list
3030
3131
3232# CHECK-LABEL: func.func @__nvqpp__mlirgen__cost(
33- # CHECK-SAME: %[[VAL_0:.*]]: !cc.stdvec<f64>) attributes {"cudaq-entrypoint", "cudaq-kernel"} {
34- # CHECK-DAG: %[[VAL_1:.*]] = arith.constant 2 : i64
35- # CHECK-DAG: %[[VAL_2:.*]] = arith.constant 1 : i64
36- # CHECK-DAG: %[[VAL_3:.*]] = arith.constant 0 : i64
37- # CHECK-DAG: %[[VAL_4:.*]] = arith.constant 4 : i64
38- # CHECK: %[[VAL_5:.*]] = quake.alloca !quake.veq<4>
39- # CHECK: %[[VAL_6:.*]] = cc.stdvec_size %[[VAL_0]] : (!cc.stdvec<f64>) -> i64
40- # CHECK: %[[VAL_7:.*]] = cc.alloca !cc.struct<{i64, f64}>{{\[}}%[[VAL_6]] : i64]
41- # CHECK: %[[VAL_8:.*]] = cc.loop while ((%[[VAL_9:.*]] = %[[VAL_3]]) -> (i64)) {
42- # CHECK: %[[VAL_10:.*]] = arith.cmpi slt, %[[VAL_9]], %[[VAL_6]] : i64
43- # CHECK: cc.condition %[[VAL_10]](%[[VAL_9]] : i64)
33+ # CHECK-SAME: %[[VAL_0:.*]]: !cc.stdvec<f64>) attributes {"cudaq-entrypoint", "cudaq-kernel"} {
34+ # CHECK: %[[VAL_1:.*]] = arith.constant 4 : i64
35+ # CHECK: %[[VAL_2:.*]] = quake.alloca !quake.veq<?>{{\[}}%[[VAL_1]] : i64]
36+ # CHECK: %[[VAL_3:.*]] = cc.stdvec_size %[[VAL_0]] : (!cc.stdvec<f64>) -> i64
37+ # CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
38+ # CHECK: %[[VAL_5:.*]] = arith.constant 1 : i64
39+ # CHECK: %[[VAL_6:.*]] = cc.loop while ((%[[VAL_7:.*]] = %[[VAL_4]]) -> (i64)) {
40+ # CHECK: %[[VAL_8:.*]] = arith.cmpi slt, %[[VAL_7]], %[[VAL_3]] : i64
41+ # CHECK: cc.condition %[[VAL_8]](%[[VAL_7]] : i64)
4442# CHECK: } do {
45- # CHECK: ^bb0(%[[VAL_11:.*]]: i64):
46- # CHECK: %[[VAL_12:.*]] = cc.undef !cc.struct<{i64, f64}>
47- # CHECK: %[[VAL_13:.*]] = cc.stdvec_data %[[VAL_0]] : (!cc.stdvec<f64>) -> !cc.ptr<!cc.array<f64 x ?>>
48- # CHECK: %[[VAL_14:.*]] = cc.compute_ptr %[[VAL_13]][%[[VAL_11]]] : (!cc.ptr<!cc.array<f64 x ?>>, i64) -> !cc.ptr<f64>
49- # CHECK: %[[VAL_15:.*]] = cc.load %[[VAL_14]] : !cc.ptr<f64>
50- # CHECK: %[[VAL_16:.*]] = cc.compute_ptr %[[VAL_7]]{{\[}}%[[VAL_11]]] : (!cc.ptr<!cc.array<!cc.struct<{i64, f64}> x ?>>, i64) -> !cc.ptr<!cc.struct<{i64, f64}>>
51- # CHECK: %[[VAL_17:.*]] = cc.insert_value %[[VAL_12]][0], %[[VAL_11]] : (!cc.struct<{i64, f64}>, i64) -> !cc.struct<{i64, f64}>
52- # CHECK: %[[VAL_18:.*]] = cc.insert_value %[[VAL_17]][1], %[[VAL_15]] : (!cc.struct<{i64, f64}>, f64) -> !cc.struct<{i64, f64}>
53- # CHECK: cc.store %[[VAL_18]], %[[VAL_16]] : !cc.ptr<!cc.struct<{i64, f64}>>
54- # CHECK: cc.continue %[[VAL_11]] : i64
43+ # CHECK: ^bb0(%[[VAL_9:.*]]: i64):
44+ # CHECK: %[[VAL_10:.*]] = cc.stdvec_data %[[VAL_0]] : (!cc.stdvec<f64>) -> !cc.ptr<!cc.array<f64 x ?>>
45+ # CHECK: %[[VAL_11:.*]] = cc.compute_ptr %[[VAL_10]]{{\[}}%[[VAL_9]]] : (!cc.ptr<!cc.array<f64 x ?>>, i64) -> !cc.ptr<f64>
46+ # CHECK: %[[VAL_12:.*]] = arith.constant 2.000000e+00 : f64
47+ # CHECK: %[[VAL_13:.*]] = arith.fptosi %[[VAL_12]] : f64 to i64
48+ # CHECK: %[[VAL_14:.*]] = arith.remui %[[VAL_9]], %[[VAL_13]] : i64
49+ # CHECK: %[[VAL_15:.*]] = arith.constant 0 : i64
50+ # CHECK: %[[VAL_16:.*]] = arith.cmpi ne, %[[VAL_14]], %[[VAL_15]] : i64
51+ # CHECK: cc.if(%[[VAL_16]]) {
52+ # CHECK: %[[VAL_17:.*]] = cc.load %[[VAL_11]] : !cc.ptr<f64>
53+ # CHECK: %[[VAL_18:.*]] = arith.constant 4 : i64
54+ # CHECK: %[[VAL_19:.*]] = arith.remui %[[VAL_9]], %[[VAL_18]] : i64
55+ # CHECK: %[[VAL_20:.*]] = quake.extract_ref %[[VAL_2]]{{\[}}%[[VAL_19]]] : (!quake.veq<?>, i64) -> !quake.ref
56+ # CHECK: quake.ry (%[[VAL_17]]) %[[VAL_20]] : (f64, !quake.ref) -> ()
57+ # CHECK: } else {
58+ # CHECK: %[[VAL_21:.*]] = cc.load %[[VAL_11]] : !cc.ptr<f64>
59+ # CHECK: %[[VAL_22:.*]] = arith.constant 4 : i64
60+ # CHECK: %[[VAL_23:.*]] = arith.remui %[[VAL_9]], %[[VAL_22]] : i64
61+ # CHECK: %[[VAL_24:.*]] = quake.extract_ref %[[VAL_2]]{{\[}}%[[VAL_23]]] : (!quake.veq<?>, i64) -> !quake.ref
62+ # CHECK: quake.rx (%[[VAL_21]]) %[[VAL_24]] : (f64, !quake.ref) -> ()
63+ # CHECK: }
64+ # CHECK: cc.continue %[[VAL_9]] : i64
5565# CHECK: } step {
56- # CHECK: ^bb0(%[[VAL_19 :.*]]: i64):
57- # CHECK: %[[VAL_20 :.*]] = arith.addi %[[VAL_19 ]], %[[VAL_2 ]] : i64
58- # CHECK: cc.continue %[[VAL_20 ]] : i64
66+ # CHECK: ^bb0(%[[VAL_25 :.*]]: i64):
67+ # CHECK: %[[VAL_26 :.*]] = arith.addi %[[VAL_25 ]], %[[VAL_5 ]] : i64
68+ # CHECK: cc.continue %[[VAL_26 ]] : i64
5969# CHECK: } {invariant}
60- # CHECK: %[[VAL_21:.*]] = cc.loop while ((%[[VAL_22:.*]] = %[[VAL_3]]) -> (i64)) {
61- # CHECK: %[[VAL_23:.*]] = arith.cmpi slt, %[[VAL_22]], %[[VAL_6]] : i64
62- # CHECK: cc.condition %[[VAL_23]](%[[VAL_22]] : i64)
70+ # CHECK: return
71+ # CHECK: }
72+
73+ # CHECK-LABEL: func.func @__nvqpp__mlirgen__cost(
74+ # CHECK-SAME: %[[VAL_0:.*]]: !cc.stdvec<f64>) attributes {"cudaq-entrypoint", "cudaq-kernel"} {
75+ # CHECK-DAG: %[[VAL_1:.*]] = arith.constant 2 : i64
76+ # CHECK-DAG: %[[VAL_2:.*]] = arith.constant 1 : i64
77+ # CHECK-DAG: %[[VAL_3:.*]] = arith.constant 0 : i64
78+ # CHECK-DAG: %[[VAL_4:.*]] = arith.constant 4 : i64
79+ # CHECK-DAG: %[[VAL_5:.*]] = quake.alloca !quake.veq<4>
80+ # CHECK: %[[VAL_6:.*]] = cc.stdvec_size %[[VAL_0]] : (!cc.stdvec<f64>) -> i64
81+ # CHECK: %[[VAL_7:.*]] = cc.loop while ((%[[VAL_8:.*]] = %[[VAL_3]]) -> (i64)) {
82+ # CHECK: %[[VAL_9:.*]] = arith.cmpi slt, %[[VAL_8]], %[[VAL_6]] : i64
83+ # CHECK: cc.condition %[[VAL_9]](%[[VAL_8]] : i64)
6384# CHECK: } do {
64- # CHECK: ^bb0(%[[VAL_24:.*]]: i64):
65- # CHECK: %[[VAL_25:.*]] = cc.compute_ptr %[[VAL_7]]{{\[}}%[[VAL_24]]] : (!cc.ptr<!cc.array<!cc.struct<{i64, f64}> x ?>>, i64) -> !cc.ptr<!cc.struct<{i64, f64}>>
66- # CHECK: %[[VAL_26:.*]] = cc.load %[[VAL_25]] : !cc.ptr<!cc.struct<{i64, f64}>>
67- # CHECK: %[[VAL_27:.*]] = cc.extract_value %[[VAL_26]][0] : (!cc.struct<{i64, f64}>) -> i64
68- # CHECK: %[[VAL_28:.*]] = cc.extract_value %[[VAL_26]][1] : (!cc.struct<{i64, f64}>) -> f64
69- # CHECK: %[[VAL_29:.*]] = arith.remui %[[VAL_27]], %[[VAL_1]] : i64
70- # CHECK: %[[VAL_30:.*]] = arith.cmpi ne, %[[VAL_29]], %[[VAL_3]] : i64
71- # CHECK: cc.if(%[[VAL_30]]) {
72- # CHECK: %[[VAL_31:.*]] = arith.remui %[[VAL_27]], %[[VAL_4]] : i64
73- # CHECK: %[[VAL_32:.*]] = quake.extract_ref %[[VAL_5]]{{\[}}%[[VAL_31]]] : (!quake.veq<4>, i64) -> !quake.ref
74- # CHECK: quake.ry (%[[VAL_28]]) %[[VAL_32]] : (f64, !quake.ref) -> ()
85+ # CHECK: ^bb0(%[[VAL_10:.*]]: i64):
86+ # CHECK: %[[VAL_11:.*]] = cc.stdvec_data %[[VAL_0]] : (!cc.stdvec<f64>) -> !cc.ptr<!cc.array<f64 x ?>>
87+ # CHECK: %[[VAL_12:.*]] = cc.compute_ptr %[[VAL_11]]{{\[}}%[[VAL_10]]] : (!cc.ptr<!cc.array<f64 x ?>>, i64) -> !cc.ptr<f64>
88+ # CHECK: %[[VAL_13:.*]] = arith.remui %[[VAL_10]], %[[VAL_1]] : i64
89+ # CHECK: %[[VAL_14:.*]] = arith.cmpi ne, %[[VAL_13]], %[[VAL_3]] : i64
90+ # CHECK: cc.if(%[[VAL_14]]) {
91+ # CHECK: %[[VAL_15:.*]] = cc.load %[[VAL_12]] : !cc.ptr<f64>
92+ # CHECK: %[[VAL_16:.*]] = arith.remui %[[VAL_10]], %[[VAL_4]] : i64
93+ # CHECK: %[[VAL_17:.*]] = quake.extract_ref %[[VAL_5]]{{\[}}%[[VAL_16]]] : (!quake.veq<4>, i64) -> !quake.ref
94+ # CHECK: quake.ry (%[[VAL_15]]) %[[VAL_17]] : (f64, !quake.ref) -> ()
7595# CHECK: } else {
76- # CHECK: %[[VAL_33:.*]] = arith.remui %[[VAL_27]], %[[VAL_4]] : i64
77- # CHECK: %[[VAL_34:.*]] = quake.extract_ref %[[VAL_5]]{{\[}}%[[VAL_33]]] : (!quake.veq<4>, i64) -> !quake.ref
78- # CHECK: quake.rx (%[[VAL_28]]) %[[VAL_34]] : (f64, !quake.ref) -> ()
96+ # CHECK: %[[VAL_18:.*]] = cc.load %[[VAL_12]] : !cc.ptr<f64>
97+ # CHECK: %[[VAL_19:.*]] = arith.remui %[[VAL_10]], %[[VAL_4]] : i64
98+ # CHECK: %[[VAL_20:.*]] = quake.extract_ref %[[VAL_5]]{{\[}}%[[VAL_19]]] : (!quake.veq<4>, i64) -> !quake.ref
99+ # CHECK: quake.rx (%[[VAL_18]]) %[[VAL_20]] : (f64, !quake.ref) -> ()
79100# CHECK: }
80- # CHECK: cc.continue %[[VAL_24 ]] : i64
101+ # CHECK: cc.continue %[[VAL_10 ]] : i64
81102# CHECK: } step {
82- # CHECK: ^bb0(%[[VAL_35 :.*]]: i64):
83- # CHECK: %[[VAL_36 :.*]] = arith.addi %[[VAL_35 ]], %[[VAL_2]] : i64
84- # CHECK: cc.continue %[[VAL_36 ]] : i64
103+ # CHECK: ^bb0(%[[VAL_21 :.*]]: i64):
104+ # CHECK: %[[VAL_22 :.*]] = arith.addi %[[VAL_21 ]], %[[VAL_2]] : i64
105+ # CHECK: cc.continue %[[VAL_22 ]] : i64
85106# CHECK: } {invariant}
86107# CHECK: return
87108# CHECK: }
109+
0 commit comments