[PATCH] D45151: [LICM] Hoisting invariant.group loads
Sanjoy Das via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 13 10:57:03 PDT 2018
sanjoy added a comment.
Can we spec `!invariant.group` in a way that lets us always keep the metadata when hoisting? Right now it isn't clear what happens if its contract is violated, i.e. what the behavior of this program is:
store i32 0, i32* %ptr, !invariant.group !0
%x = load i32, i32* %ptr, !invariant.group !0
store i32 1, i32* %ptr, !invariant.group !0
%y = load i32, i32* %ptr, !invariant.group !0
though it seems like you're assuming the *load* has UB? Can we instead say that the second store has UB? That way we should be able to hoist the load instruction without dropping the metadata.
================
Comment at: llvm/lib/Transforms/Scalar/LICM.cpp:542
+ // the metadata. This is because we don't know yet if it's better to hoist it
+ // and loose metadata, or to keep the metadata counting that we will be able
+ // to merge this load with another outside the loop.
----------------
lose
================
Comment at: llvm/lib/Transforms/Scalar/LICM.cpp:1075
// drop. It is a compile time optimization, not required for correctness.
- !isGuaranteedToExecute(I, DT, CurLoop, SafetyInfo))
+ !canKeepMetadata(I, DT, CurLoop, SafetyInfo))
I.dropUnknownNonDebugMetadata();
----------------
Not sure what this replacement adds -- do you plan to add more stuff to `canKeepMetadata` in the future?
Repository:
rL LLVM
https://reviews.llvm.org/D45151
More information about the llvm-commits
mailing list