Hi Jeff, On Sat, Jul 26, 2025 at 7:05 PM Jeff Law <jeffreya...@gmail.com> wrote: > > > > On 7/22/25 4:19 AM, Konstantinos Eleftheriou wrote: > > While scanning the instructions and upon reaching an instruction that > > doesn't satisfy the constraints that we have set, we were removing the > > already detected stores, but we were continuing adding stores from that > > point onward. This was causing issues when the address ranges from later > > stores overlapped with the load's address, leading to partial and wrong > > update of the register containing the loaded value. > > > > With this patch, we are skipping the tranformation for stores that operate > > on the load's address range, when stores that operate on the same range > > have been deleted due to constraint violations. > > > > PR rtl-optimization/119795 > > > > gcc/ChangeLog: > > > > * avoid-store-forwarding.cc > > (store_forwarding_analyzer::avoid_store_forwarding): Skip > > transformations for stores that operate on the same address > > range as deleted ones. > > > > gcc/testsuite/ChangeLog: > > > > + /* Check if another store in the load's address range has > > + been deleted due to a constraint violation. In this case > > + we can't forward any other stores that operate in this > > + range, as it would lead to partial update of the register > > + that holds the loaded value. */ > > + FOR_EACH_VEC_ELT (store_exprs_del, j, del_it) > > + { > > + rtx del_store_mem = *del_it; > > + same_range_as_removed > > + = is_store_forwarding (del_store_mem, load_mem, NULL); > > + break; > > + } > Doesn't this break the loop after the first element every time? What am > I missing here? Sorry, I was missing an "if" statement there. Sent a new version https://gcc.gnu.org/pipermail/gcc-patches/2025-July/690829.html . > > Jeff
Thanks, Konstantinos