@@ -127,3 +127,54 @@ def test_interleaved_case(interleave_point):
127127 assert bb .instructions [- 1 ].operands [0 ] == op3_inv
128128 else :
129129 assert bb .instructions [- 1 ].operands [0 ] == op3
130+
131+
132+ def test_offsets ():
133+ ctx = IRContext ()
134+ fn = ctx .create_function ("_global" )
135+
136+ bb = fn .get_basic_block ()
137+
138+ br1 = IRBasicBlock (IRLabel ("then" ), fn )
139+ fn .append_basic_block (br1 )
140+ br2 = IRBasicBlock (IRLabel ("else" ), fn )
141+ fn .append_basic_block (br2 )
142+
143+ p1 = bb .append_instruction ("param" )
144+ op1 = bb .append_instruction ("store" , 32 )
145+ op2 = bb .append_instruction ("add" , 0 , IRLabel ("mem" ))
146+ op3 = bb .append_instruction ("store" , 64 )
147+ bb .append_instruction ("dloadbytes" , op1 , op2 , op3 )
148+ op5 = bb .append_instruction ("mload" , op3 )
149+ op6 = bb .append_instruction ("iszero" , op5 )
150+ bb .append_instruction ("jnz" , op6 , br1 .label , br2 .label )
151+
152+ op01 = br1 .append_instruction ("store" , 32 )
153+ op02 = br1 .append_instruction ("add" , 0 , IRLabel ("mem" ))
154+ op03 = br1 .append_instruction ("store" , 64 )
155+ br1 .append_instruction ("dloadbytes" , op01 , op02 , op03 )
156+ op05 = br1 .append_instruction ("mload" , op03 )
157+ op06 = br1 .append_instruction ("iszero" , op05 )
158+ br1 .append_instruction ("return" , p1 , op06 )
159+
160+ op11 = br2 .append_instruction ("store" , 32 )
161+ op12 = br2 .append_instruction ("add" , 0 , IRLabel ("mem" ))
162+ op13 = br2 .append_instruction ("store" , 64 )
163+ br2 .append_instruction ("dloadbytes" , op11 , op12 , op13 )
164+ op15 = br2 .append_instruction ("mload" , op13 )
165+ op16 = br2 .append_instruction ("iszero" , op15 )
166+ br2 .append_instruction ("return" , p1 , op16 )
167+
168+ ac = IRAnalysesCache (fn )
169+ MakeSSA (ac , fn ).run_pass ()
170+ AlgebraicOptimizationPass (ac , fn ).run_pass ()
171+ RemoveUnusedVariablesPass (ac , fn ).run_pass ()
172+
173+ offset_count = 0
174+ for bb in fn .get_basic_blocks ():
175+ for instruction in bb .instructions :
176+ assert instruction .opcode != "add"
177+ if instruction .opcode == "offset" :
178+ offset_count += 1
179+
180+ assert offset_count == 3
0 commit comments