In this example, SimplifyCFG::FoldTwoEntryPHINode will make the load unconditional, without removing the !range annotation (which would then kill a null check, in the original testcase): target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @GV = external constant i64 define i64 @test(i1 %cond) { entry: br i1 %cond, label %if, label %then then: %pti = ptrtoint i64* @GV to i64 br label %join if: %load = load i64, i64* @GV, align 8, !range !0 br label %join join: %phi = phi i64 [ %pti, %then ], [ %load, %if ] ret i64 %phi } !0 = !{i64 1, i64 0} ; ----------------------- ; After opt -simplifycfg: define i64 @test(i1 %cond) { entry: %pti = ptrtoint i64* @GV to i64 %load = load i64, i64* @GV, align 8, !range !0 %phi = select i1 %cond, i64 %load, i64 %pti ret i64 %phi }
this patch seems to fix it: diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index d11f4e8..59f416e 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2110,14 +2110,20 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, // Move all 'aggressive' instructions, which are defined in the // conditional parts of the if's up to the dominating block. - if (IfBlock1) + if (IfBlock1) { + for (auto &I : *IfBlock1) + I.dropUnknownNonDebugMetadata(); DomBlock->getInstList().splice(InsertPt->getIterator(), IfBlock1->getInstList(), IfBlock1->begin(), IfBlock1->getTerminator()->getIterator()); - if (IfBlock2) + } + if (IfBlock2) { + for (auto &I : *IfBlock2) + I.dropUnknownNonDebugMetadata(); DomBlock->getInstList().splice(InsertPt->getIterator(), IfBlock2->getInstList(), IfBlock2->begin(), IfBlock2->getTerminator()->getIterator()); + } while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) { // Change the PHI node into a select instruction.
Fixed in r279980.