Before this patch, loop metadata (if exists) will override the metadata of each predecessor; if the predecessor block already has loop metadata, the orignal loop metadata won't be preserved abd cause missed loop transformations (see 'test2' in llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll).
To illustrate how inner-loop metadata might be dropped:
CFG Before
# BB is while.cond.exit, attached with loop metdata md2. # BB->Pred is for.body, attached with loop metadata md1. entry | v ---> while.cond -------------> while.end | | | v | while.body | | | v | for.body <---- (md1) | | |______| | v | while.cond.exit (md2) | | |_______|
CFG After
# while.cond1 is the merge of while.cond.exit and while.cond above. # for.body is attached with md2, and md1 is dropped. # If LoopSimplify runs later (as a part of loop pass), it could create # dedicated exits for inner-loop (essentially adding `while.cond.exit` basck), # but won't it won't see 'md1' nor restore it for the inner-loop. entry | v ---> while.cond1 -------------> while.end | | | v | while.body | | | v | for.body <---- (md2) |_______| |______|
There is no need to document option 1 and option 2 here.