This is an archive of the discontinued LLVM Phabricator instance.

[Local] Keep K's range if K does not move when combining metadata.
ClosedPublic

Authored by fhahn on Sep 4 2018, 7:01 AM.

Details

Summary

As K has to dominate I, IIUC I's range metadata must be a subset of
K's. After Eli's recent clarification to the LangRef, loading a value
outside of the range is undefined behavior.
Therefore if I's range contains elements outside of K's range and we would load
one such value, K would cause undefined behavior.

In cases like hoisting/sinking, we still want the most generic range
over all code paths to/from the hoist/sink point. As suggested in the
patches related to D47339, I will refactor the handling of those
scenarios and try to decouple it from this function as follow up, once
we switched to a similar handling of metadata in most of
combineMetadata.

I updated some tests checking mostly the merging of metadata to keep the
metadata of to dominating load. The most interesting one is probably test8 in
test/Transforms/JumpThreading/thread-loads.ll. It contained a comment
about the alias metadata preventing us to eliminate the branch, but it
seem like the actual problem currently is that we merge the ranges of
both loads and cannot eliminate the icmp afterwards. With this patch, we
manage to eliminate the icmp, as the range of the first load excludes 8.

Diff Detail

Event Timeline

fhahn created this revision.Sep 4 2018, 7:01 AM
efriedma accepted this revision.Oct 26 2018, 2:31 PM

LGTM; sorry about the delay.

This revision is now accepted and ready to land.Oct 26 2018, 2:31 PM
This revision was automatically updated to reflect the committed changes.

Thank you very much Eli! I'll take a look at the other metadata kinds as well.