Skip to content

Commit 3b0f04c

Browse files
authored
Fix issues with python range boundaries (#2571)
* Fix tests Signed-off-by: Anna Gringauze <[email protected]> * Remove unneded file Signed-off-by: Anna Gringauze <[email protected]> * Update changed test output Signed-off-by: Anna Gringauze <[email protected]> --------- Signed-off-by: Anna Gringauze <[email protected]>
1 parent f1e8fe8 commit 3b0f04c

File tree

4 files changed

+99
-35
lines changed

4 files changed

+99
-35
lines changed

python/cudaq/kernel/ast_bridge.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,8 @@ def visit_Assign(self, node):
10891089
self.subscriptPushPointerValue = True
10901090
# Visit the subscript node, get the pointer value
10911091
self.visit(node.targets[0])
1092+
# Reset the push pointer value flag
1093+
self.subscriptPushPointerValue = False
10921094
ptrVal = self.popValue()
10931095
if not cc.PointerType.isinstance(ptrVal.type):
10941096
self.emitFatalError(
@@ -1108,8 +1110,6 @@ def visit_Assign(self, node):
11081110
valueToStore = self.popValue()
11091111
# Store the value
11101112
cc.StoreOp(valueToStore, ptrVal)
1111-
# Reset the push pointer value flag
1112-
self.subscriptPushPointerValue = False
11131113
return
11141114

11151115
else:
@@ -1456,11 +1456,13 @@ def get_full_module_path(partial_path):
14561456

14571457
# The total number of elements in the iterable
14581458
# we are generating should be `N == endVal - startVal`
1459-
totalSize = math.AbsIOp(arith.SubIOp(endVal,
1460-
startVal).result).result
1459+
actualSize = arith.SubIOp(endVal, startVal).result
1460+
totalSize = math.AbsIOp(actualSize).result
14611461

14621462
# If the step is not == 1, then we also have
14631463
# to update the total size for the range iterable
1464+
actualSize = arith.DivSIOp(actualSize,
1465+
math.AbsIOp(stepVal).result).result
14641466
totalSize = arith.DivSIOp(totalSize,
14651467
math.AbsIOp(stepVal).result).result
14661468

@@ -1499,7 +1501,7 @@ def bodyBuilder(iterVar):
14991501
isDecrementing=isDecrementing)
15001502

15011503
self.pushValue(iterable)
1502-
self.pushValue(totalSize)
1504+
self.pushValue(actualSize)
15031505
return
15041506

15051507
if node.func.id == 'enumerate':

python/tests/kernel/test_kernel_features.py

+68
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,74 @@ def kernel(myList: list[int]):
557557
assert '1' * 5 in counts
558558

559559

560+
def test_list_boundaries():
561+
562+
@cudaq.kernel
563+
def kernel1():
564+
qubits = cudaq.qvector(2)
565+
r = range(0, 0)
566+
for i in r:
567+
x(qubits[i])
568+
569+
counts = cudaq.sample(kernel1)
570+
assert len(counts) == 1
571+
assert '00' in counts
572+
573+
@cudaq.kernel
574+
def kernel2():
575+
qubits = cudaq.qvector(2)
576+
r = range(1, 0)
577+
for i in r:
578+
x(qubits[i])
579+
580+
counts = cudaq.sample(kernel2)
581+
assert len(counts) == 1
582+
assert '00' in counts
583+
584+
@cudaq.kernel
585+
def kernel3():
586+
qubits = cudaq.qvector(2)
587+
for i in range(-1):
588+
x(qubits[i])
589+
590+
counts = cudaq.sample(kernel3)
591+
assert len(counts) == 1
592+
assert '00' in counts
593+
594+
@cudaq.kernel
595+
def kernel4():
596+
qubits = cudaq.qvector(4)
597+
r = [i * 2 + 1 for i in range(-1)]
598+
for i in r:
599+
x(qubits[i])
600+
601+
counts = cudaq.sample(kernel4)
602+
assert len(counts) == 1
603+
assert '0000' in counts
604+
605+
@cudaq.kernel
606+
def kernel5():
607+
qubits = cudaq.qvector(4)
608+
r = [i * 2 + 1 for i in range(0)]
609+
for i in r:
610+
x(qubits[i])
611+
612+
counts = cudaq.sample(kernel5)
613+
assert len(counts) == 1
614+
assert '0000' in counts
615+
616+
@cudaq.kernel
617+
def kernel6():
618+
qubits = cudaq.qvector(4)
619+
r = [i * 2 + 1 for i in range(2)]
620+
for i in r:
621+
x(qubits[i])
622+
623+
counts = cudaq.sample(kernel6)
624+
assert len(counts) == 1
625+
assert '0101' in counts
626+
627+
560628
def test_control_operations():
561629

562630
@cudaq.kernel

python/tests/mlir/test_output_qir.py

+12-15
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ def ghz(numQubits: int):
2525
print(cudaq.translate(ghz_synth, format='qir-base'))
2626

2727

28-
# CHECK: %[[VAL_0:.*]] = tail call
29-
# CHECK: %[[VAL_1:.*]]* @__quantum__rt__qubit_allocate_array(i64
30-
# CHECK: %[[VAL_2:.*]])
28+
# CHECK: %[[VAL_0:.*]] = tail call %[[VAL_1:.*]]* @__quantum__rt__qubit_allocate_array(i64 %[[VAL_2:.*]])
3129
# CHECK: %[[VAL_3:.*]] = tail call i8* @__quantum__rt__array_get_element_ptr_1d(%[[VAL_1]]* %[[VAL_0]], i64 0)
3230
# CHECK: %[[VAL_4:.*]] = bitcast i8* %[[VAL_3]] to %[[VAL_5:.*]]**
3331
# CHECK: %[[VAL_6:.*]] = load %[[VAL_5]]*, %[[VAL_5]]** %[[VAL_4]], align 8
@@ -43,25 +41,24 @@ def ghz(numQubits: int):
4341
# CHECK: store i64 %[[VAL_14]], i64* %[[VAL_16]], align 8
4442
# CHECK: %[[VAL_15]] = add nuw nsw i64 %[[VAL_14]], 1
4543
# CHECK: %[[VAL_17:.*]] = icmp slt i64 %[[VAL_15]], %[[VAL_7]]
46-
# CHECK: br i1 %[[VAL_17]], label %[[VAL_11]], label %[[VAL_12]]
47-
# CHECK: ._crit_edge: ; preds = %[[VAL_11]], %[[VAL_13]]
48-
# CHECK: %[[VAL_18:.*]] = alloca { i64, i64 }, i64 %[[VAL_8]], align 8
49-
# CHECK: %[[VAL_19:.*]] = icmp sgt i64 %[[VAL_8]], 0
50-
# CHECK: br i1 %[[VAL_19]], label %[[VAL_20:.*]], label %[[VAL_21:.*]]
44+
# CHECK: br i1 %[[VAL_17]], label %[[VAL_11]], label %[[VAL_21:.*]]
45+
# CHECK: ._crit_edge: ; preds = %[[VAL_11]]
46+
# CHECK: %[[VAL_18:.*]] = alloca { i64, i64 }, i64 %[[VAL_7]], align 8
47+
# CHECK: br i1 %[[VAL_10]], label %[[VAL_20:.*]], label %[[VAL_21]]
5148
# CHECK: .preheader: ; preds = %[[VAL_20]]
52-
# CHECK: br i1 %[[VAL_19]], label %[[VAL_22:.*]], label %[[VAL_21]]
53-
# CHECK: .lr.ph9: ; preds = %[[VAL_12]], %[[VAL_20]]
54-
# CHECK: %[[VAL_23:.*]] = phi i64 [ %[[VAL_24:.*]], %[[VAL_20]] ], [ 0, %[[VAL_12]] ]
49+
# CHECK: br i1 %[[VAL_10]], label %[[VAL_22:.*]], label %[[VAL_21]]
50+
# CHECK: .lr.ph10: ; preds = %[[VAL_21]], %[[VAL_20]]
51+
# CHECK: %[[VAL_23:.*]] = phi i64 [ %[[VAL_24:.*]], %[[VAL_20]] ], [ 0, %[[VAL_21]] ]
5552
# CHECK: %[[VAL_25:.*]] = getelementptr i64, i64* %[[VAL_9]], i64 %[[VAL_23]]
5653
# CHECK: %[[VAL_26:.*]] = load i64, i64* %[[VAL_25]], align 8
5754
# CHECK: %[[VAL_27:.*]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAL_18]], i64 %[[VAL_23]], i32 0
5855
# CHECK: store i64 %[[VAL_23]], i64* %[[VAL_27]], align 8
5956
# CHECK: %[[VAL_28:.*]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAL_18]], i64 %[[VAL_23]], i32 1
6057
# CHECK: store i64 %[[VAL_26]], i64* %[[VAL_28]], align 8
6158
# CHECK: %[[VAL_24]] = add nuw nsw i64 %[[VAL_23]], 1
62-
# CHECK: %[[VAL_29:.*]] = icmp slt i64 %[[VAL_24]], %[[VAL_8]]
59+
# CHECK: %[[VAL_29:.*]] = icmp slt i64 %[[VAL_24]], %[[VAL_7]]
6360
# CHECK: br i1 %[[VAL_29]], label %[[VAL_20]], label %[[VAL_30:.*]]
64-
# CHECK: .lr.ph10: ; preds = %[[VAL_30]], %[[VAL_22]]
61+
# CHECK: .lr.ph11: ; preds = %[[VAL_30]], %[[VAL_22]]
6562
# CHECK: %[[VAL_31:.*]] = phi i64 [ %[[VAL_32:.*]], %[[VAL_22]] ], [ 0, %[[VAL_30]] ]
6663
# CHECK: %[[VAL_33:.*]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAL_18]], i64 %[[VAL_31]], i32 0
6764
# CHECK: %[[VAL_34:.*]] = load i64, i64* %[[VAL_33]], align 8
@@ -76,9 +73,9 @@ def ghz(numQubits: int):
7673
# CHECK: %[[VAL_43:.*]] = load %[[VAL_5]]*, %[[VAL_5]]** %[[VAL_42]], align 8
7774
# CHECK: tail call void (i64, void (%[[VAL_1]]*, %[[VAL_5]]*)*, ...) @invokeWithControlQubits(i64 1, void (%[[VAL_1]]*, %[[VAL_5]]*)* nonnull @__quantum__qis__x__ctl, %[[VAL_5]]* %[[VAL_39]], %[[VAL_5]]* %[[VAL_43]])
7875
# CHECK: %[[VAL_32]] = add nuw nsw i64 %[[VAL_31]], 1
79-
# CHECK: %[[VAL_44:.*]] = icmp slt i64 %[[VAL_32]], %[[VAL_8]]
76+
# CHECK: %[[VAL_44:.*]] = icmp slt i64 %[[VAL_32]], %[[VAL_7]]
8077
# CHECK: br i1 %[[VAL_44]], label %[[VAL_22]], label %[[VAL_21]]
81-
# CHECK: ._crit_edge11: ; preds = %[[VAL_22]], %[[VAL_12]], %[[VAL_30]]
78+
# CHECK: ._crit_edge12: ; preds = %[[VAL_22]], %[[VAL_13]], %[[VAL_21]], %[[VAL_30]]
8279
# CHECK: tail call void @__quantum__rt__qubit_release_array(%[[VAL_1]]* %[[VAL_0]])
8380
# CHECK: ret void
8481

python/tests/mlir/test_output_translate_qir.py

+12-15
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ def ghz(numQubits: int):
2525
print(cudaq.translate(ghz_synth, format='qir-base'))
2626

2727

28-
# CHECK: %[[VAL_0:.*]] = tail call
29-
# CHECK: %[[VAL_1:.*]]* @__quantum__rt__qubit_allocate_array(i64
30-
# CHECK: %[[VAL_2:.*]])
28+
# CHECK: %[[VAL_0:.*]] = tail call %[[VAL_1:.*]]* @__quantum__rt__qubit_allocate_array(i64 %[[VAL_2:.*]])
3129
# CHECK: %[[VAL_3:.*]] = tail call i8* @__quantum__rt__array_get_element_ptr_1d(%[[VAL_1]]* %[[VAL_0]], i64 0)
3230
# CHECK: %[[VAL_4:.*]] = bitcast i8* %[[VAL_3]] to %[[VAL_5:.*]]**
3331
# CHECK: %[[VAL_6:.*]] = load %[[VAL_5]]*, %[[VAL_5]]** %[[VAL_4]], align 8
@@ -43,25 +41,24 @@ def ghz(numQubits: int):
4341
# CHECK: store i64 %[[VAL_14]], i64* %[[VAL_16]], align 8
4442
# CHECK: %[[VAL_15]] = add nuw nsw i64 %[[VAL_14]], 1
4543
# CHECK: %[[VAL_17:.*]] = icmp slt i64 %[[VAL_15]], %[[VAL_7]]
46-
# CHECK: br i1 %[[VAL_17]], label %[[VAL_11]], label %[[VAL_12]]
47-
# CHECK: ._crit_edge: ; preds = %[[VAL_11]], %[[VAL_13]]
48-
# CHECK: %[[VAL_18:.*]] = alloca { i64, i64 }, i64 %[[VAL_8]], align 8
49-
# CHECK: %[[VAL_19:.*]] = icmp sgt i64 %[[VAL_8]], 0
50-
# CHECK: br i1 %[[VAL_19]], label %[[VAL_20:.*]], label %[[VAL_21:.*]]
44+
# CHECK: br i1 %[[VAL_17]], label %[[VAL_11]], label %[[VAL_21:.*]]
45+
# CHECK: ._crit_edge: ; preds = %[[VAL_11]]
46+
# CHECK: %[[VAL_18:.*]] = alloca { i64, i64 }, i64 %[[VAL_7]], align 8
47+
# CHECK: br i1 %[[VAL_10]], label %[[VAL_20:.*]], label %[[VAL_21]]
5148
# CHECK: .preheader: ; preds = %[[VAL_20]]
52-
# CHECK: br i1 %[[VAL_19]], label %[[VAL_22:.*]], label %[[VAL_21]]
53-
# CHECK: .lr.ph9: ; preds = %[[VAL_12]], %[[VAL_20]]
54-
# CHECK: %[[VAL_23:.*]] = phi i64 [ %[[VAL_24:.*]], %[[VAL_20]] ], [ 0, %[[VAL_12]] ]
49+
# CHECK: br i1 %[[VAL_10]], label %[[VAL_22:.*]], label %[[VAL_21]]
50+
# CHECK: .lr.ph10: ; preds = %[[VAL_21]], %[[VAL_20]]
51+
# CHECK: %[[VAL_23:.*]] = phi i64 [ %[[VAL_24:.*]], %[[VAL_20]] ], [ 0, %[[VAL_21]] ]
5552
# CHECK: %[[VAL_25:.*]] = getelementptr i64, i64* %[[VAL_9]], i64 %[[VAL_23]]
5653
# CHECK: %[[VAL_26:.*]] = load i64, i64* %[[VAL_25]], align 8
5754
# CHECK: %[[VAL_27:.*]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAL_18]], i64 %[[VAL_23]], i32 0
5855
# CHECK: store i64 %[[VAL_23]], i64* %[[VAL_27]], align 8
5956
# CHECK: %[[VAL_28:.*]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAL_18]], i64 %[[VAL_23]], i32 1
6057
# CHECK: store i64 %[[VAL_26]], i64* %[[VAL_28]], align 8
6158
# CHECK: %[[VAL_24]] = add nuw nsw i64 %[[VAL_23]], 1
62-
# CHECK: %[[VAL_29:.*]] = icmp slt i64 %[[VAL_24]], %[[VAL_8]]
59+
# CHECK: %[[VAL_29:.*]] = icmp slt i64 %[[VAL_24]], %[[VAL_7]]
6360
# CHECK: br i1 %[[VAL_29]], label %[[VAL_20]], label %[[VAL_30:.*]]
64-
# CHECK: .lr.ph10: ; preds = %[[VAL_30]], %[[VAL_22]]
61+
# CHECK: .lr.ph11: ; preds = %[[VAL_30]], %[[VAL_22]]
6562
# CHECK: %[[VAL_31:.*]] = phi i64 [ %[[VAL_32:.*]], %[[VAL_22]] ], [ 0, %[[VAL_30]] ]
6663
# CHECK: %[[VAL_33:.*]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAL_18]], i64 %[[VAL_31]], i32 0
6764
# CHECK: %[[VAL_34:.*]] = load i64, i64* %[[VAL_33]], align 8
@@ -76,9 +73,9 @@ def ghz(numQubits: int):
7673
# CHECK: %[[VAL_43:.*]] = load %[[VAL_5]]*, %[[VAL_5]]** %[[VAL_42]], align 8
7774
# CHECK: tail call void (i64, void (%[[VAL_1]]*, %[[VAL_5]]*)*, ...) @invokeWithControlQubits(i64 1, void (%[[VAL_1]]*, %[[VAL_5]]*)* nonnull @__quantum__qis__x__ctl, %[[VAL_5]]* %[[VAL_39]], %[[VAL_5]]* %[[VAL_43]])
7875
# CHECK: %[[VAL_32]] = add nuw nsw i64 %[[VAL_31]], 1
79-
# CHECK: %[[VAL_44:.*]] = icmp slt i64 %[[VAL_32]], %[[VAL_8]]
76+
# CHECK: %[[VAL_44:.*]] = icmp slt i64 %[[VAL_32]], %[[VAL_7]]
8077
# CHECK: br i1 %[[VAL_44]], label %[[VAL_22]], label %[[VAL_21]]
81-
# CHECK: ._crit_edge11: ; preds = %[[VAL_22]], %[[VAL_12]], %[[VAL_30]]
78+
# CHECK: ._crit_edge12: ; preds = %[[VAL_22]], %[[VAL_13]], %[[VAL_21]], %[[VAL_30]]
8279
# CHECK: tail call void @__quantum__rt__qubit_release_array(%[[VAL_1]]* %[[VAL_0]])
8380
# CHECK: ret void
8481

0 commit comments

Comments
 (0)