-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add mem adds too many mems #179
Comments
Related issue: File: lit/mem/closure/out_of_nothing2_simpl.thorin in ad_ptr_merge.
Original code: .con q_5577173_reshape_2446227 _2446228::[_2446268: .Idx 4294967296, _2446230: .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]] @(1:(.Idx 2)) = {
.let _2446258: [%mem.M, %mem.Ptr (.Idx 4294967296, 0)] = %mem.malloc (.Idx 4294967296, 0) (⊤:%mem.M, 4);
.let _2446275: %mem.M = %mem.store (.Idx 4294967296, 0) (_2446258#0:(.Idx 2), _2446258#1:(.Idx 2), _2446268);
_2446230 (_2446275, _2446258#1:(.Idx 2))
};
.con printIntegerNL [%mem.M, .Idx 4294967296, .Cn %mem.M] @(<nullptr>) = {
<unset>
};
.con .extern main __5577659_2446186::[mem_5577661_2446188: %mem.M, argc_5577675_2446203: .Idx 4294967296, %mem.Ptr (%mem.Ptr (.Idx 256, 0), 0), return_5577845_2446403: .Cn [%mem.M, .Idx 4294967296]] @(1:(.Idx 2)) = {
.con __5577835_reshape_2446400 _2446404: %mem.M @(1:(.Idx 2)) = {
return_5577845_2446403 (_2446404, 0:(.Idx 4294967296))
};
.con __5577811_reshape_2446395 _2446396: %mem.M @(1:(.Idx 2)) = {
printIntegerNL (_2446396, ⊥:.Idx 4294967296, __5577835_reshape_2446400)
};
.con inner_cont_5577580_reshape_2446315 [%mem.M, %mem.Ptr (.Idx 4294967296, 0)] @(1:(.Idx 2)) = {
.let _2446189: [%mem.M, %mem.Ptr (.Idx 4294967296, 0)] = %mem.alloc (.Idx 4294967296, 0) mem_5577661_2446188;
.let _2446210: %mem.M = %mem.store (.Idx 4294967296, 0) (_2446189#0:(.Idx 2), _2446189#1:(.Idx 2), argc_5577675_2446203);
.let _2446212: [%mem.M, %mem.Ptr (.Cn [.Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]], 0)] = %mem.malloc (.Cn [.Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]], 0) (_2446210, 8);
.let _2446284: %mem.M = %mem.store (.Cn [.Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]], 0) (_2446212#0:(.Idx 2), _2446212#1:(.Idx 2), q_5577173_reshape_2446227);
// ^ this store is dropped
.let _2446292: [%mem.M, .Idx 4294967296] = %mem.load (.Idx 4294967296, 0) (_2446284, _2446189#1:(.Idx 2));
.let _2446392: .Idx 4294967296 = %core.wrap.mul 4294967296 0 (2:(.Idx 4294967296), _2446292#1:(.Idx 2));
printIntegerNL (⊤:%mem.M, _2446392, __5577811_reshape_2446395)
};
.let _2446302: [%mem.M, .Cn [.Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]]] = %mem.load (.Cn [.Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]], 0) (_2446292#0:(.Idx 2), _2446212#1:(.Idx 2));
_2446302#1:(.Idx 2) (_2446292#1:(.Idx 2), inner_cont_5577580_reshape_2446315)
}; turns into .con .extern main __5577659_2446447::[mem_5577661_2446456: %mem.M, argc_5577675_2446466: .Idx 4294967296, _2446481: %mem.Ptr (%mem.Ptr (.Idx 256, 0), 0), return_5577845_2446491: .Cn [%mem.M, .Idx 4294967296]] @(1:(.Idx 2)) = {
.con __5577835_reshape_2446888 _2446892: %mem.M @(1:(.Idx 2)) = {
return_5577845_2446491 (_2446892, 0:(.Idx 4294967296))
};
.con __5577811_reshape_2446857 _2446861: %mem.M @(1:(.Idx 2)) = {
printIntegerNL (_2446861, ⊥:.Idx 4294967296, __5577835_reshape_2446888)
};
.con inner_cont_5577580_reshape_2446796 _2446801::[_2446815: %mem.M, _2446830: %mem.Ptr (.Idx 4294967296, 0)] @(1:(.Idx 2)) = {
.let _2446532: [%mem.M, %mem.Ptr (.Idx 4294967296, 0)] = %mem.alloc (.Idx 4294967296, 0) mem_5577661_2446456;
.let _2446728: [%mem.M, .Idx 4294967296] = %mem.load (.Idx 4294967296, 0) (mem_5577661_2446456, _2446532#1:(.Idx 2));
.let _2446979: .Idx 4294967296 = %core.wrap.mul 4294967296 0 (2:(.Idx 4294967296), _2446728#1:(.Idx 2));
printIntegerNL (_2446815, _2446979, __5577811_reshape_2446857)
};
.let _2446627: [%mem.M, %mem.Ptr (.Cn [%mem.M, .Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]], 0)] = %mem.malloc (.Cn [%mem.M, .Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]], 0) (mem_5577661_2446456, 8);
.let _2446772: [%mem.M, .Cn [%mem.M, .Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]]] = %mem.load (.Cn [%mem.M, .Idx 4294967296, .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]], 0) (mem_5577661_2446456, _2446627#1:(.Idx 2));
_2446772#1:(.Idx 2) (mem_5577661_2446456, _2446728#1:(.Idx 2), inner_cont_5577580_reshape_2446796)
}; The higher-order store for instance is dropped during the transformation. |
A further (possibly simpler) example: An additional mem is inserted in the |
The
add_mem
pass adds unnecessary mems in nested argument tuples but not in the functions:.con tup_pb_5577562 _5577572::[tup_s_5577574::[_5577575: .Idx 4294967296, _5577579: .Idx 4294967296], tup_ret_cont_5577584: .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]]
(readable:
tup_pb: (Int*Int)*Cn (mem*Ptr(Int))
)becomes
[%mem.M, «2; .Idx 4294967296», .Cn [%mem.M, %mem.Ptr (.Idx 4294967296, 0)]]
(
mem*Int²*Cn(mem*Ptr(Int))
)and the following error occurs:
The pass correctly adds the memory
_2442813
in the outer tuple but also adds an additional memory in the inner tuple.File:
lit/mem/closure/out_of_nothing2_simpl.thorin
inad_ptr_merge
.The text was updated successfully, but these errors were encountered: