Skip to content

Commit a14075f

Browse files
committed
Tests for :xform_hoist_lets
Signed-off-by: Alastair Reid <[email protected]>
1 parent e009893 commit a14075f

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %asli --batchmode --exec=:xform_hoist_lets --exec=":show --format=raw FUT" %s | filecheck %s
2+
// Copyright (C) 2025-2025 Intel Corporation
3+
4+
func FUT(x : bits(32), i : integer {0..32}) => boolean
5+
begin
6+
// The original motivating example - this prevented use
7+
// of a transformation that looked for "IsZero(x[_ +: _])"
8+
return IsZero(__let wd : integer = 32-i __in
9+
__let ix : integer = 31-i __in
10+
x[ix +: wd]);
11+
end
12+
13+
// CHECK: let wd : integer = asl_sub_int.0{}(32, i);
14+
// CHECK: let ix : integer = asl_sub_int.0{}(31, i);
15+
// CHECK: return IsZero.0{wd}({bits(32)}x[ix +: wd]);
+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// RUN: %asli --batchmode --exec=:xform_hoist_lets --exec=":show --format=raw FUT" %s | filecheck %s
2+
// Copyright (C) 2025-2025 Intel Corporation
3+
4+
func FUT(i : integer) => boolean
5+
begin
6+
// Check that lets are not lifted past sequencing points
7+
8+
// AND
9+
let r1 = i >= 0 && (__let t : integer = 10 __in i <= t);
10+
// CHECK: asl_and_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t));
11+
let r2 = i >= 0 && i <= (__let t : integer = 10 __in t);
12+
// CHECK: asl_and_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t));
13+
14+
// OR
15+
let r3 = i >= 0 || i <= (__let t : integer = 10 __in t);
16+
// CHECK: asl_or_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t));
17+
18+
// IMPLIES
19+
let r4 = i >= 0 --> i <= (__let t : integer = 10 __in t);
20+
// CHECK: asl_implies_bool.0{}(asl_ge_int.0{}(i, 0), __let t : integer = 10 __in asl_le_int.0{}(i, t));
21+
22+
// IF expression
23+
let r5 = if i >= 0 then i <= (__let t : integer = 10 __in t) else FALSE;
24+
// CHECK: if asl_ge_int.0{}(i, 0) then __let t : integer = 10 __in asl_le_int.0{}(i, t) else FALSE;
25+
26+
// IF statement
27+
if __let b1 : boolean = i >= 0 __in b1 then
28+
let r6 = i <= (__let t : integer = 10 __in t);
29+
else
30+
let r7 = i <= (__let t : integer = 10 __in t);
31+
end
32+
// CHECK: let b1 : boolean = asl_ge_int.0{}(i, 0);
33+
// CHECK-NEXT: if b1 then
34+
// CHECK-NEXT: let t : integer = 10;
35+
// CHECK-NEXT: let r6 : boolean = asl_le_int.0{}(i, t);
36+
// CHECK-NEXT: else
37+
// CHECK-NEXT: let t : integer = 10;
38+
// CHECK-NEXT: let r7 : boolean = asl_le_int.0{}(i, t);
39+
// CHECK-NEXT: end
40+
41+
// WHILE loop
42+
while i <= (__let t : integer = 10 __in t) do
43+
end
44+
// CHECK: while __let t : integer = 10 __in asl_le_int.0{}(i, t) do
45+
// CHECK-NEXT:
46+
// CHECK-NEXT: end
47+
48+
// REPEAT loop
49+
repeat
50+
let x = 42;
51+
until i <= (__let t : integer = 10 __in t);
52+
// CHECK: repeat
53+
// CHECK-NEXT: let x : integer{42} = 42;
54+
// CHECK-NEXT: let t : integer = 10;
55+
// CHECK-NEXT: until asl_le_int.0{}(i, t);
56+
57+
return r1 && r2 && r3 && r4 && r5;
58+
end
59+

0 commit comments

Comments
 (0)