Skip to content

Commit b48fbfa

Browse files
authored
Eliminate identity casts (#29435)
Prevents the generation of instructions that cast the the same type during code generation.
1 parent 3a5e20c commit b48fbfa

4 files changed

Lines changed: 367 additions & 389 deletions

File tree

crates/passes/src/code_generation/expression.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@ impl CodeGeneratingVisitor<'_> {
262262
let (operand, mut instructions) = self.visit_expression(&input.expression);
263263
let operand = operand.expect("Trying to cast an empty expression");
264264

265+
// if the source already has the target type, reuse its operand directly instead of emitting a no-op cast.
266+
if self.state.type_table.get(&input.expression.id()).as_ref() == Some(&input.type_) {
267+
return (operand, instructions);
268+
}
269+
265270
// Construct the destination register.
266271
let dest_reg = self.next_register();
267272

@@ -1129,8 +1134,8 @@ impl CodeGeneratingVisitor<'_> {
11291134
let new_reg = self.next_register();
11301135
match typ {
11311136
Type::Address => {
1132-
let ins = AleoStmt::Cast(register.clone(), new_reg.clone(), AleoType::Address);
1133-
((AleoExpr::Reg(new_reg)), vec![ins])
1137+
let cast = AleoStmt::Cast(register.clone(), new_reg.clone(), AleoType::Address);
1138+
((AleoExpr::Reg(new_reg)), vec![cast])
11341139
}
11351140
Type::Boolean => {
11361141
let ins = AleoStmt::Cast(register.clone(), new_reg.clone(), AleoType::Boolean);

tests/expectations/compiler/dyn_record/dyn_record_cast_as_field_access.out

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,4 @@ function main:
88
input r0 as Token.record;
99
cast r0 into r1 as dynamic.record;
1010
get.record.dynamic r1.balance into r2 as u64;
11-
cast r2 into r3 as u64;
12-
output r3 as u64.private;
11+
output r2 as u64.private;

tests/expectations/compiler/expression/cast.out

Lines changed: 155 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -30,169 +30,158 @@ function main:
3030
cast r0 into r26 as scalar;
3131
cast r1 into r27 as field;
3232
cast r1 into r28 as group;
33-
cast r1 into r29 as boolean;
34-
cast r1 into r30 as i8;
35-
cast r1 into r31 as i16;
36-
cast r1 into r32 as i32;
37-
cast r1 into r33 as i64;
38-
cast r1 into r34 as i128;
39-
cast r1 into r35 as u8;
40-
cast r1 into r36 as u16;
41-
cast r1 into r37 as u32;
42-
cast r1 into r38 as u64;
43-
cast r1 into r39 as u128;
44-
cast r1 into r40 as scalar;
45-
cast r2 into r41 as field;
46-
cast r2 into r42 as group;
47-
cast r2 into r43 as boolean;
48-
cast r2 into r44 as i8;
49-
cast r2 into r45 as i16;
50-
cast r2 into r46 as i32;
51-
cast r2 into r47 as i64;
52-
cast r2 into r48 as i128;
53-
cast r2 into r49 as u8;
54-
cast r2 into r50 as u16;
55-
cast r2 into r51 as u32;
56-
cast r2 into r52 as u64;
57-
cast r2 into r53 as u128;
58-
cast r2 into r54 as scalar;
59-
cast r3 into r55 as field;
60-
cast r3 into r56 as group;
61-
cast r3 into r57 as boolean;
62-
cast r3 into r58 as i8;
63-
cast r3 into r59 as i16;
64-
cast r3 into r60 as i32;
65-
cast r3 into r61 as i64;
66-
cast r3 into r62 as i128;
67-
cast r3 into r63 as u8;
68-
cast r3 into r64 as u16;
69-
cast r3 into r65 as u32;
70-
cast r3 into r66 as u64;
71-
cast r3 into r67 as u128;
72-
cast r3 into r68 as scalar;
73-
cast r4 into r69 as field;
74-
cast r4 into r70 as group;
75-
cast r4 into r71 as boolean;
76-
cast r4 into r72 as i8;
77-
cast r4 into r73 as i16;
78-
cast r4 into r74 as i32;
79-
cast r4 into r75 as i64;
80-
cast r4 into r76 as i128;
81-
cast r4 into r77 as u8;
82-
cast r4 into r78 as u16;
83-
cast r4 into r79 as u32;
84-
cast r4 into r80 as u64;
85-
cast r4 into r81 as u128;
86-
cast r4 into r82 as scalar;
87-
cast r5 into r83 as field;
88-
cast r5 into r84 as group;
89-
cast r5 into r85 as boolean;
90-
cast r5 into r86 as i8;
91-
cast r5 into r87 as i16;
92-
cast r5 into r88 as i32;
93-
cast r5 into r89 as i64;
94-
cast r5 into r90 as i128;
95-
cast r5 into r91 as u8;
96-
cast r5 into r92 as u16;
97-
cast r5 into r93 as u32;
98-
cast r5 into r94 as u64;
99-
cast r5 into r95 as u128;
100-
cast r5 into r96 as scalar;
101-
cast r6 into r97 as field;
102-
cast r6 into r98 as group;
103-
cast r6 into r99 as boolean;
104-
cast r6 into r100 as i8;
105-
cast r6 into r101 as i16;
106-
cast r6 into r102 as i32;
107-
cast r6 into r103 as i64;
108-
cast r6 into r104 as i128;
109-
cast r6 into r105 as u8;
110-
cast r6 into r106 as u16;
111-
cast r6 into r107 as u32;
112-
cast r6 into r108 as u64;
113-
cast r6 into r109 as u128;
114-
cast r6 into r110 as scalar;
115-
cast r7 into r111 as field;
116-
cast r7 into r112 as group;
117-
cast r7 into r113 as boolean;
118-
cast r7 into r114 as i8;
119-
cast r7 into r115 as i16;
120-
cast r7 into r116 as i32;
121-
cast r7 into r117 as i64;
122-
cast r7 into r118 as i128;
123-
cast r7 into r119 as u8;
124-
cast r7 into r120 as u16;
125-
cast r7 into r121 as u32;
126-
cast r7 into r122 as u64;
127-
cast r7 into r123 as u128;
128-
cast r7 into r124 as scalar;
129-
cast r8 into r125 as field;
130-
cast r8 into r126 as group;
131-
cast r8 into r127 as boolean;
132-
cast r8 into r128 as i8;
133-
cast r8 into r129 as i16;
134-
cast r8 into r130 as i32;
135-
cast r8 into r131 as i64;
136-
cast r8 into r132 as i128;
137-
cast r8 into r133 as u8;
138-
cast r8 into r134 as u16;
139-
cast r8 into r135 as u32;
140-
cast r8 into r136 as u64;
141-
cast r8 into r137 as u128;
142-
cast r8 into r138 as scalar;
143-
cast r9 into r139 as field;
144-
cast r9 into r140 as group;
145-
cast r9 into r141 as boolean;
146-
cast r9 into r142 as i8;
147-
cast r9 into r143 as i16;
148-
cast r9 into r144 as i32;
149-
cast r9 into r145 as i64;
150-
cast r9 into r146 as i128;
151-
cast r9 into r147 as u8;
152-
cast r9 into r148 as u16;
153-
cast r9 into r149 as u32;
154-
cast r9 into r150 as u64;
155-
cast r9 into r151 as u128;
156-
cast r9 into r152 as scalar;
157-
cast r10 into r153 as field;
158-
cast r10 into r154 as group;
159-
cast r10 into r155 as boolean;
160-
cast r10 into r156 as i8;
161-
cast r10 into r157 as i16;
162-
cast r10 into r158 as i32;
163-
cast r10 into r159 as i64;
164-
cast r10 into r160 as i128;
165-
cast r10 into r161 as u8;
166-
cast r10 into r162 as u16;
167-
cast r10 into r163 as u32;
168-
cast r10 into r164 as u64;
169-
cast r10 into r165 as u128;
170-
cast r11 into r166 as field;
171-
cast r11 into r167 as group;
172-
cast r11 into r168 as boolean;
173-
cast r11 into r169 as i8;
174-
cast r11 into r170 as i16;
175-
cast r11 into r171 as i32;
176-
cast r11 into r172 as i64;
177-
cast r11 into r173 as i128;
178-
cast r11 into r174 as u8;
179-
cast r11 into r175 as u16;
180-
cast r11 into r176 as u32;
181-
cast r11 into r177 as u64;
182-
cast r11 into r178 as u128;
183-
cast r11 into r179 as scalar;
184-
cast r12 into r180 as field;
185-
cast r12 into r181 as group;
186-
cast r12 into r182 as boolean;
187-
cast r12 into r183 as i8;
188-
cast r12 into r184 as i16;
189-
cast r12 into r185 as i32;
190-
cast r12 into r186 as i64;
191-
cast r12 into r187 as i128;
192-
cast r12 into r188 as u8;
193-
cast r12 into r189 as u16;
194-
cast r12 into r190 as u32;
195-
cast r12 into r191 as u64;
196-
cast r12 into r192 as u128;
197-
is.eq r166 r180 into r193;
198-
output r193 as boolean.private;
33+
cast r1 into r29 as i8;
34+
cast r1 into r30 as i16;
35+
cast r1 into r31 as i32;
36+
cast r1 into r32 as i64;
37+
cast r1 into r33 as i128;
38+
cast r1 into r34 as u8;
39+
cast r1 into r35 as u16;
40+
cast r1 into r36 as u32;
41+
cast r1 into r37 as u64;
42+
cast r1 into r38 as u128;
43+
cast r1 into r39 as scalar;
44+
cast r2 into r40 as group;
45+
cast r2 into r41 as boolean;
46+
cast r2 into r42 as i8;
47+
cast r2 into r43 as i16;
48+
cast r2 into r44 as i32;
49+
cast r2 into r45 as i64;
50+
cast r2 into r46 as i128;
51+
cast r2 into r47 as u8;
52+
cast r2 into r48 as u16;
53+
cast r2 into r49 as u32;
54+
cast r2 into r50 as u64;
55+
cast r2 into r51 as u128;
56+
cast r2 into r52 as scalar;
57+
cast r3 into r53 as field;
58+
cast r3 into r54 as group;
59+
cast r3 into r55 as boolean;
60+
cast r3 into r56 as i16;
61+
cast r3 into r57 as i32;
62+
cast r3 into r58 as i64;
63+
cast r3 into r59 as i128;
64+
cast r3 into r60 as u8;
65+
cast r3 into r61 as u16;
66+
cast r3 into r62 as u32;
67+
cast r3 into r63 as u64;
68+
cast r3 into r64 as u128;
69+
cast r3 into r65 as scalar;
70+
cast r4 into r66 as field;
71+
cast r4 into r67 as group;
72+
cast r4 into r68 as boolean;
73+
cast r4 into r69 as i8;
74+
cast r4 into r70 as i32;
75+
cast r4 into r71 as i64;
76+
cast r4 into r72 as i128;
77+
cast r4 into r73 as u8;
78+
cast r4 into r74 as u16;
79+
cast r4 into r75 as u32;
80+
cast r4 into r76 as u64;
81+
cast r4 into r77 as u128;
82+
cast r4 into r78 as scalar;
83+
cast r5 into r79 as field;
84+
cast r5 into r80 as group;
85+
cast r5 into r81 as boolean;
86+
cast r5 into r82 as i8;
87+
cast r5 into r83 as i16;
88+
cast r5 into r84 as i32;
89+
cast r5 into r85 as i128;
90+
cast r5 into r86 as u8;
91+
cast r5 into r87 as u16;
92+
cast r5 into r88 as u32;
93+
cast r5 into r89 as u64;
94+
cast r5 into r90 as u128;
95+
cast r5 into r91 as scalar;
96+
cast r6 into r92 as field;
97+
cast r6 into r93 as group;
98+
cast r6 into r94 as boolean;
99+
cast r6 into r95 as i8;
100+
cast r6 into r96 as i16;
101+
cast r6 into r97 as i32;
102+
cast r6 into r98 as i64;
103+
cast r6 into r99 as u8;
104+
cast r6 into r100 as u16;
105+
cast r6 into r101 as u32;
106+
cast r6 into r102 as u64;
107+
cast r6 into r103 as u128;
108+
cast r6 into r104 as scalar;
109+
cast r7 into r105 as field;
110+
cast r7 into r106 as group;
111+
cast r7 into r107 as boolean;
112+
cast r7 into r108 as i8;
113+
cast r7 into r109 as i16;
114+
cast r7 into r110 as i32;
115+
cast r7 into r111 as i64;
116+
cast r7 into r112 as i128;
117+
cast r7 into r113 as u16;
118+
cast r7 into r114 as u32;
119+
cast r7 into r115 as u64;
120+
cast r7 into r116 as u128;
121+
cast r7 into r117 as scalar;
122+
cast r8 into r118 as field;
123+
cast r8 into r119 as group;
124+
cast r8 into r120 as boolean;
125+
cast r8 into r121 as i8;
126+
cast r8 into r122 as i16;
127+
cast r8 into r123 as i32;
128+
cast r8 into r124 as i64;
129+
cast r8 into r125 as i128;
130+
cast r8 into r126 as u8;
131+
cast r8 into r127 as u32;
132+
cast r8 into r128 as u64;
133+
cast r8 into r129 as u128;
134+
cast r8 into r130 as scalar;
135+
cast r9 into r131 as field;
136+
cast r9 into r132 as group;
137+
cast r9 into r133 as boolean;
138+
cast r9 into r134 as i8;
139+
cast r9 into r135 as i16;
140+
cast r9 into r136 as i32;
141+
cast r9 into r137 as i64;
142+
cast r9 into r138 as i128;
143+
cast r9 into r139 as u8;
144+
cast r9 into r140 as u16;
145+
cast r9 into r141 as u64;
146+
cast r9 into r142 as u128;
147+
cast r9 into r143 as scalar;
148+
cast r10 into r144 as field;
149+
cast r10 into r145 as group;
150+
cast r10 into r146 as boolean;
151+
cast r10 into r147 as i8;
152+
cast r10 into r148 as i16;
153+
cast r10 into r149 as i32;
154+
cast r10 into r150 as i64;
155+
cast r10 into r151 as i128;
156+
cast r10 into r152 as u8;
157+
cast r10 into r153 as u16;
158+
cast r10 into r154 as u32;
159+
cast r10 into r155 as u128;
160+
cast r11 into r156 as field;
161+
cast r11 into r157 as group;
162+
cast r11 into r158 as boolean;
163+
cast r11 into r159 as i8;
164+
cast r11 into r160 as i16;
165+
cast r11 into r161 as i32;
166+
cast r11 into r162 as i64;
167+
cast r11 into r163 as i128;
168+
cast r11 into r164 as u8;
169+
cast r11 into r165 as u16;
170+
cast r11 into r166 as u32;
171+
cast r11 into r167 as u64;
172+
cast r11 into r168 as scalar;
173+
cast r12 into r169 as field;
174+
cast r12 into r170 as group;
175+
cast r12 into r171 as boolean;
176+
cast r12 into r172 as i8;
177+
cast r12 into r173 as i16;
178+
cast r12 into r174 as i32;
179+
cast r12 into r175 as i64;
180+
cast r12 into r176 as i128;
181+
cast r12 into r177 as u8;
182+
cast r12 into r178 as u16;
183+
cast r12 into r179 as u32;
184+
cast r12 into r180 as u64;
185+
cast r12 into r181 as u128;
186+
is.eq r156 r169 into r182;
187+
output r182 as boolean.private;

0 commit comments

Comments
 (0)