<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Hi <font size="2"><span style="font-size:11pt;">Mikael,</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;"><br>
</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">it looks like the failure is in
<font size="2"><span style="font-size:11pt;">DuplicateInstructionsInSplitBetween</span></font>, that's odd. I am happy to have a look, but I am travelling until Saturday, so I  can only have a look then. If it is blocking you in anyway, please feel free to
 revert the commit and I will re-commit it with a fix later. <br>
</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;"><br>
</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">Cheers,</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">Florian<br>
</span></font></p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Mikael Holmén <mikael.holmen@ericsson.com><br>
<b>Sent:</b> Monday, February 19, 2018 8:28:21 AM<br>
<b>To:</b> Florian Hahn; llvm-commits@lists.llvm.org<br>
<b>Subject:</b> Re: [llvm] r325126 - Recommit r325001: [CallSiteSplitting] Support splitting of blocks with instrs before call.</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Hi Florian,<br>
<br>
I ran into a failed assertion with this commit:<br>
<br>
opt -S -o - foo.ll -callsite-splitting<br>
<br>
gives<br>
<br>
opt: ../include/llvm/ADT/ilist_iterator.h:140: reference <br>
llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, <br>
true, false, void>, false, false>::operator*() const [OptionsT = <br>
llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, <br>
IsReverse = false, IsConst = false]: Assertion <br>
`!NodePtr->isKnownSentinel()' failed.<br>
#0 0x0000000001ec20d4 PrintStackTraceSignalHandler(void*) <br>
(build-all/bin/opt+0x1ec20d4)<br>
#1 0x0000000001ec2846 SignalHandler(int) (build-all/bin/opt+0x1ec2846)<br>
#2 0x00007fb6628a8810 __restore_rt (/lib64/libpthread.so.0+0xf810)<br>
#3 0x00007fb661a53875 __GI_raise (/lib64/libc.so.6+0x32875)<br>
#4 0x00007fb661a54e51 __GI_abort (/lib64/libc.so.6+0x33e51)<br>
#5 0x00007fb661a4c740 __GI___assert_fail (/lib64/libc.so.6+0x2b740)<br>
#6 0x0000000001eee3ba <br>
llvm::DuplicateInstructionsInSplitBetween(llvm::BasicBlock*, <br>
llvm::BasicBlock*, llvm::Instruction*, llvm::ValueMap<llvm::Value <br>
const*, llvm::WeakTrackingVH, llvm::ValueMapConfig<llvm::Value const*, <br>
llvm::sys::SmartMutex<false> > >&) (build-all/bin/opt+0x1eee3ba)<br>
#7 0x0000000001c5f31d splitCallSite(llvm::CallSite, <br>
llvm::SmallVectorImpl<std::pair<llvm::BasicBlock*, <br>
llvm::SmallVector<std::pair<llvm::ICmpInst*, unsigned int>, 2u> > > <br>
const&) (build-all/bin/opt+0x1c5f31d)<br>
#8 0x0000000001c5e993 doCallSiteSplitting(llvm::Function&, <br>
llvm::TargetLibraryInfo&, llvm::TargetTransformInfo&) <br>
(build-all/bin/opt+0x1c5e993)<br>
#9 0x0000000001c6068f (anonymous <br>
namespace)::CallSiteSplittingLegacyPass::runOnFunction(llvm::Function&) <br>
(build-all/bin/opt+0x1c6068f)<br>
#10 0x000000000197e648 <br>
llvm::FPPassManager::runOnFunction(llvm::Function&) <br>
(build-all/bin/opt+0x197e648)<br>
#11 0x000000000197e888 llvm::FPPassManager::runOnModule(llvm::Module&) <br>
(build-all/bin/opt+0x197e888)<br>
#12 0x000000000197ed68 llvm::legacy::PassManagerImpl::run(llvm::Module&) <br>
(build-all/bin/opt+0x197ed68)<br>
#13 0x000000000072a7f3 main (build-all/bin/opt+0x72a7f3)<br>
#14 0x00007fb661a3fc36 __libc_start_main (/lib64/libc.so.6+0x1ec36)<br>
#15 0x00000000007150dd _start <br>
/usr/src/packages/BUILD/glibc-2.11.3/csu/../sysdeps/x86_64/elf/start.S:116:0<br>
Stack dump:<br>
0.      Program arguments: build-all/bin/opt -S -o - foo.ll <br>
-callsite-splitting<br>
1.      Running pass 'Function Pass Manager' on module 'foo.ll'.<br>
2.      Running pass 'Call-site splitting' on function '@main'<br>
Abort<br>
<br>
Regards,<br>
Mikael<br>
<br>
On 02/14/2018 02:59 PM, Florian Hahn via llvm-commits wrote:<br>
> Author: fhahn<br>
> Date: Wed Feb 14 05:59:12 2018<br>
> New Revision: 325126<br>
> <br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=325126&view=rev">http://llvm.org/viewvc/llvm-project?rev=325126&view=rev</a><br>
> Log:<br>
> Recommit r325001: [CallSiteSplitting] Support splitting of blocks with instrs before call.<br>
> <br>
> For basic blocks with instructions between the beginning of the block<br>
> and a call we have to duplicate the instructions before the call in all<br>
> split blocks and add PHI nodes for uses of the duplicated instructions<br>
> after the call.<br>
> <br>
> Currently, the threshold for the number of instructions before a call<br>
> is quite low, to keep the impact on binary size low.<br>
> <br>
> Reviewers: junbuml, mcrosier, davidxl, davide<br>
> <br>
> Reviewed By: junbuml<br>
> <br>
> Differential Revision: <a href="https://reviews.llvm.org/D41860">https://reviews.llvm.org/D41860</a><br>
> <br>
> Added:<br>
>      llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll<br>
> Modified:<br>
>      llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp<br>
>      llvm/trunk/test/Other/new-pm-lto-defaults.ll<br>
>      llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll<br>
>      llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll<br>
>      llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll<br>
>      llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll<br>
> <br>
> Modified: llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp?rev=325126&r1=325125&r2=325126&view=diff">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp?rev=325126&r1=325125&r2=325126&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp Wed Feb 14 05:59:12 2018<br>
> @@ -59,11 +59,13 @@<br>
>   #include "llvm/Transforms/Scalar/CallSiteSplitting.h"<br>
>   #include "llvm/ADT/Statistic.h"<br>
>   #include "llvm/Analysis/TargetLibraryInfo.h"<br>
> +#include "llvm/Analysis/TargetTransformInfo.h"<br>
>   #include "llvm/IR/IntrinsicInst.h"<br>
>   #include "llvm/IR/PatternMatch.h"<br>
>   #include "llvm/Support/Debug.h"<br>
>   #include "llvm/Transforms/Scalar.h"<br>
>   #include "llvm/Transforms/Utils/BasicBlockUtils.h"<br>
> +#include "llvm/Transforms/Utils/Cloning.h"<br>
>   #include "llvm/Transforms/Utils/Local.h"<br>
>   <br>
>   using namespace llvm;<br>
> @@ -73,6 +75,15 @@ using namespace PatternMatch;<br>
>   <br>
>   STATISTIC(NumCallSiteSplit, "Number of call-site split");<br>
>   <br>
> +/// Only allow instructions before a call, if their CodeSize cost is below<br>
> +/// DuplicationThreshold. Those instructions need to be duplicated in all<br>
> +/// split blocks.<br>
> +static cl::opt<unsigned><br>
> +    DuplicationThreshold("callsite-splitting-duplication-threshold", cl::Hidden,<br>
> +                         cl::desc("Only allow instructions before a call, if "<br>
> +                                  "their cost is below DuplicationThreshold"),<br>
> +                         cl::init(5));<br>
> +<br>
>   static void addNonNullAttribute(CallSite CS, Value *Op) {<br>
>     unsigned ArgNo = 0;<br>
>     for (auto &I : CS.args()) {<br>
> @@ -168,20 +179,26 @@ static SmallVector<BasicBlock *, 2> getT<br>
>     return Preds;<br>
>   }<br>
>   <br>
> -static bool canSplitCallSite(CallSite CS) {<br>
> +static bool canSplitCallSite(CallSite CS, TargetTransformInfo &TTI) {<br>
>     // FIXME: As of now we handle only CallInst. InvokeInst could be handled<br>
>     // without too much effort.<br>
>     Instruction *Instr = CS.getInstruction();<br>
>     if (!isa<CallInst>(Instr))<br>
>       return false;<br>
>   <br>
> -  // Allow splitting a call-site only when there is no instruction before the<br>
> -  // call-site in the basic block. Based on this constraint, we only clone the<br>
> -  // call instruction, and we do not move a call-site across any other<br>
> -  // instruction.<br>
>     BasicBlock *CallSiteBB = Instr->getParent();<br>
> -  if (Instr != CallSiteBB->getFirstNonPHIOrDbg())<br>
> -    return false;<br>
> +  // Allow splitting a call-site only when the CodeSize cost of the<br>
> +  // instructions before the call is less then DuplicationThreshold. The<br>
> +  // instructions before the call will be duplicated in the split blocks and<br>
> +  // corresponding uses will be updated.<br>
> +  unsigned Cost = 0;<br>
> +  for (auto &InstBeforeCall :<br>
> +       llvm::make_range(CallSiteBB->begin(), Instr->getIterator())) {<br>
> +    Cost += TTI.getInstructionCost(&InstBeforeCall,<br>
> +                                   TargetTransformInfo::TCK_CodeSize);<br>
> +    if (Cost >= DuplicationThreshold)<br>
> +      return false;<br>
> +  }<br>
>   <br>
>     // Need 2 predecessors and cannot split an edge from an IndirectBrInst.<br>
>     SmallVector<BasicBlock *, 2> Preds(predecessors(CallSiteBB));<br>
> @@ -246,16 +263,21 @@ static void splitCallSite(<br>
>       CallPN = PHINode::Create(Instr->getType(), Preds.size(), "phi.call");<br>
>   <br>
>     DEBUG(dbgs() << "split call-site : " << *Instr << " into \n");<br>
> -  for (const auto &P : Preds) {<br>
> -    BasicBlock *PredBB = P.first;<br>
> -    BasicBlock *SplitBlock =<br>
> -        SplitBlockPredecessors(TailBB, PredBB, ".predBB.split");<br>
> +<br>
> +  assert(Preds.size() == 2 && "The ValueToValueMaps array has size 2.");<br>
> +  // ValueToValueMapTy is neither copy nor moveable, so we use a simple array<br>
> +  // here.<br>
> +  ValueToValueMapTy ValueToValueMaps[2];<br>
> +  for (unsigned i = 0; i < Preds.size(); i++) {<br>
> +    BasicBlock *PredBB = Preds[i].first;<br>
> +    BasicBlock *SplitBlock = DuplicateInstructionsInSplitBetween(<br>
> +        TailBB, PredBB, &*std::next(Instr->getIterator()), ValueToValueMaps[i]);<br>
>       assert(SplitBlock && "Unexpected new basic block split.");<br>
>   <br>
> -    Instruction *NewCI = Instr->clone();<br>
> +    Instruction *NewCI =<br>
> +        &*std::prev(SplitBlock->getTerminator()->getIterator());<br>
>       CallSite NewCS(NewCI);<br>
> -    addConditions(NewCS, P.second);<br>
> -    NewCI->insertBefore(&*SplitBlock->getFirstInsertionPt());<br>
> +    addConditions(NewCS, Preds[i].second);<br>
>   <br>
>       // Handle PHIs used as arguments in the call-site.<br>
>       for (PHINode &PN : TailBB->phis()) {<br>
> @@ -273,13 +295,41 @@ static void splitCallSite(<br>
>         CallPN->addIncoming(NewCI, SplitBlock);<br>
>     }<br>
>   <br>
> +  auto *OriginalBegin = &*TailBB->begin();<br>
>     // Replace users of the original call with a PHI mering call-sites split.<br>
>     if (CallPN) {<br>
> -    CallPN->insertBefore(TailBB->getFirstNonPHI());<br>
> +    CallPN->insertBefore(OriginalBegin);<br>
>       Instr->replaceAllUsesWith(CallPN);<br>
>     }<br>
>   <br>
> -  Instr->eraseFromParent();<br>
> +  // Remove instructions moved to split blocks from TailBB, from the duplicated<br>
> +  // call instruction to the beginning of the basic block. If an instruction<br>
> +  // has any uses, add a new PHI node to combine the values coming from the<br>
> +  // split blocks. The new PHI nodes are placed before the first original<br>
> +  // instruction, so we do not end up deleting them. By using reverse-order, we<br>
> +  // do not introduce unnecessary PHI nodes for def-use chains from the call<br>
> +  // instruction to the beginning of the block.<br>
> +  auto I = Instr->getReverseIterator();<br>
> +  while (I != TailBB->rend()) {<br>
> +    Instruction *CurrentI = &*I++;<br>
> +    if (!CurrentI->use_empty()) {<br>
> +      // If an existing PHI has users after the call, there is no need to create<br>
> +      // a new one.<br>
> +      if (isa<PHINode>(CurrentI))<br>
> +        continue;<br>
> +      PHINode *NewPN = PHINode::Create(CurrentI->getType(), Preds.size());<br>
> +      for (auto &Mapping : ValueToValueMaps)<br>
> +        NewPN->addIncoming(Mapping[CurrentI],<br>
> +                           cast<Instruction>(Mapping[CurrentI])->getParent());<br>
> +      NewPN->insertBefore(&*TailBB->begin());<br>
> +      CurrentI->replaceAllUsesWith(NewPN);<br>
> +    }<br>
> +    CurrentI->eraseFromParent();<br>
> +    // We are done once we handled the first original instruction in TailBB.<br>
> +    if (CurrentI == OriginalBegin)<br>
> +      break;<br>
> +  }<br>
> +<br>
>     NumCallSiteSplit++;<br>
>   }<br>
>   <br>
> @@ -344,14 +394,15 @@ static bool tryToSplitOnPredicatedArgume<br>
>     return true;<br>
>   }<br>
>   <br>
> -static bool tryToSplitCallSite(CallSite CS) {<br>
> -  if (!CS.arg_size() || !canSplitCallSite(CS))<br>
> +static bool tryToSplitCallSite(CallSite CS, TargetTransformInfo &TTI) {<br>
> +  if (!CS.arg_size() || !canSplitCallSite(CS, TTI))<br>
>       return false;<br>
>     return tryToSplitOnPredicatedArgument(CS) ||<br>
>            tryToSplitOnPHIPredicatedArgument(CS);<br>
>   }<br>
>   <br>
> -static bool doCallSiteSplitting(Function &F, TargetLibraryInfo &TLI) {<br>
> +static bool doCallSiteSplitting(Function &F, TargetLibraryInfo &TLI,<br>
> +                                TargetTransformInfo &TTI) {<br>
>     bool Changed = false;<br>
>     for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE;) {<br>
>       BasicBlock &BB = *BI++;<br>
> @@ -364,7 +415,7 @@ static bool doCallSiteSplitting(Function<br>
>         Function *Callee = CS.getCalledFunction();<br>
>         if (!Callee || Callee->isDeclaration())<br>
>           continue;<br>
> -      Changed |= tryToSplitCallSite(CS);<br>
> +      Changed |= tryToSplitCallSite(CS, TTI);<br>
>       }<br>
>     }<br>
>     return Changed;<br>
> @@ -379,6 +430,7 @@ struct CallSiteSplittingLegacyPass : pub<br>
>   <br>
>     void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
>       AU.addRequired<TargetLibraryInfoWrapperPass>();<br>
> +    AU.addRequired<TargetTransformInfoWrapperPass>();<br>
>       FunctionPass::getAnalysisUsage(AU);<br>
>     }<br>
>   <br>
> @@ -387,7 +439,8 @@ struct CallSiteSplittingLegacyPass : pub<br>
>         return false;<br>
>   <br>
>       auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();<br>
> -    return doCallSiteSplitting(F, TLI);<br>
> +    auto &TTI = getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);<br>
> +    return doCallSiteSplitting(F, TLI, TTI);<br>
>     }<br>
>   };<br>
>   } // namespace<br>
> @@ -396,6 +449,7 @@ char CallSiteSplittingLegacyPass::ID = 0<br>
>   INITIALIZE_PASS_BEGIN(CallSiteSplittingLegacyPass, "callsite-splitting",<br>
>                         "Call-site splitting", false, false)<br>
>   INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)<br>
> +INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
>   INITIALIZE_PASS_END(CallSiteSplittingLegacyPass, "callsite-splitting",<br>
>                       "Call-site splitting", false, false)<br>
>   FunctionPass *llvm::createCallSiteSplittingPass() {<br>
> @@ -405,8 +459,9 @@ FunctionPass *llvm::createCallSiteSplitt<br>
>   PreservedAnalyses CallSiteSplittingPass::run(Function &F,<br>
>                                                FunctionAnalysisManager &AM) {<br>
>     auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);<br>
> +  auto &TTI = AM.getResult<TargetIRAnalysis>(F);<br>
>   <br>
> -  if (!doCallSiteSplitting(F, TLI))<br>
> +  if (!doCallSiteSplitting(F, TLI, TTI))<br>
>       return PreservedAnalyses::all();<br>
>     PreservedAnalyses PA;<br>
>     return PA;<br>
> <br>
> Modified: llvm/trunk/test/Other/new-pm-lto-defaults.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pm-lto-defaults.ll?rev=325126&r1=325125&r2=325126&view=diff">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pm-lto-defaults.ll?rev=325126&r1=325125&r2=325126&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Other/new-pm-lto-defaults.ll (original)<br>
> +++ llvm/trunk/test/Other/new-pm-lto-defaults.ll Wed Feb 14 05:59:12 2018<br>
> @@ -35,6 +35,7 @@<br>
>   ; CHECK-O2-NEXT: Starting llvm::Function pass manager run.<br>
>   ; CHECK-O2-NEXT: Running pass: CallSiteSplittingPass on foo<br>
>   ; CHECK-O2-NEXT: Running analysis: TargetLibraryAnalysis on foo<br>
> +; CHECK-O2-NEXT: Running analysis: TargetIRAnalysis on foo<br>
>   ; CHECK-O2-NEXT: Finished llvm::Function pass manager run.<br>
>   ; CHECK-O2-NEXT: PGOIndirectCallPromotion<br>
>   ; CHECK-O2-NEXT: Running analysis: ProfileSummaryAnalysis<br>
> @@ -79,7 +80,6 @@<br>
>   ; CHECK-O2-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}PostOrderFunctionAttrsPass><br>
>   ; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}><br>
>   ; CHECK-O2-NEXT: Running analysis: MemoryDependenceAnalysis<br>
> -; CHECK-O2-NEXT: Running analysis: TargetIRAnalysis on foo<br>
>   ; CHECK-O2-NEXT: Running analysis: DemandedBitsAnalysis<br>
>   ; CHECK-O2-NEXT: Running pass: CrossDSOCFIPass<br>
>   ; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}SimplifyCFGPass><br>
> <br>
> Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll?rev=325126&view=auto">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll?rev=325126&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll (added)<br>
> +++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll Wed Feb 14 05:59:12 2018<br>
> @@ -0,0 +1,253 @@<br>
> +; RUN: opt -S -callsite-splitting < %s | FileCheck --check-prefix=CHECK %s<br>
> +; RUN: opt -S -callsite-splitting -callsite-splitting-duplication-threshold=0 < %s | FileCheck --check-prefix=NODUP %s<br>
> +<br>
> +; Instructions before a call that will be pushed to its predecessors<br>
> +; with uses after the callsite, must be patched up as PHI nodes in<br>
> +; the join block.<br>
> +define i32* @test_split_branch_phi(i32* %ptrarg, i32 %i) {<br>
> +Header:<br>
> +  %tobool = icmp ne i32* %ptrarg, null<br>
> +  br i1 %tobool, label %TBB, label %CallSite<br>
> +<br>
> +TBB:                                    ; preds = %Header<br>
> +  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42<br>
> +  %0 = load i32, i32* %arrayidx, align 4<br>
> +  %tobool1 = icmp ne i32 %0, 0<br>
> +  br i1 %tobool1, label %CallSite, label %End<br>
> +<br>
> +CallSite:                                          ; preds = %TBB, %Header<br>
> +  %somepointer = getelementptr i32, i32* %ptrarg, i64 18<br>
> +  call void @bar(i32* %ptrarg, i32 %i)<br>
> +  br label %End<br>
> +<br>
> +End:                                           ; preds = %CallSite, %TBB<br>
> +  %somepointerphi = phi i32* [ %somepointer, %CallSite ], [ null, %TBB ]<br>
> +  ret i32* %somepointerphi<br>
> +}<br>
> +; NODUP-LABEL: test_split_branch_phi<br>
> +; NODUP-NOT: split<br>
> +; CHECK-LABEL: Header.split<br>
> +; CHECK: %[[V1:somepointer[0-9]+]] = getelementptr i32, i32* %ptrarg, i64 18<br>
> +; CHECK: call void @bar(i32* null, i32 %i)<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK-LABEL: TBB.split:<br>
> +; CHECK: %[[V2:somepointer[0-9]+]] = getelementptr i32, i32* %ptrarg, i64 18<br>
> +; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %i)<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK: CallSite:<br>
> +; CHECK: phi i32* [ %[[V1]], %Header.split ], [ %[[V2]], %TBB.split ]<br>
> +<br>
> +<br>
> +define void @split_branch_no_extra_phi(i32* %ptrarg, i32 %i) {<br>
> +Header:<br>
> +  %tobool = icmp ne i32* %ptrarg, null<br>
> +  br i1 %tobool, label %TBB, label %CallSite<br>
> +<br>
> +TBB:                                    ; preds = %Header<br>
> +  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42<br>
> +  %0 = load i32, i32* %arrayidx, align 4<br>
> +  %tobool1 = icmp ne i32 %0, 0<br>
> +  br i1 %tobool1, label %CallSite, label %End<br>
> +<br>
> +CallSite:                                          ; preds = %TBB, %Header<br>
> +  %i.add = add i32 %i, 99<br>
> +  call void @bar(i32* %ptrarg, i32 %i.add)<br>
> +  br label %End<br>
> +<br>
> +End:                                           ; preds = %CallSite, %TBB<br>
> +  ret void<br>
> +}<br>
> +; NODUP-LABEL: split_branch_no_extra_phi<br>
> +; NODUP-NOT: split<br>
> +; CHECK-LABEL: split_branch_no_extra_phi<br>
> +; CHECK-LABEL: Header.split<br>
> +; CHECK: %[[V1:.+]] = add i32 %i, 99<br>
> +; CHECK: call void @bar(i32* null, i32 %[[V1]])<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK-LABEL: TBB.split:<br>
> +; CHECK: %[[V2:.+]] = add i32 %i, 99<br>
> +; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %[[V2]])<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK: CallSite:<br>
> +; CHECK-NOT: phi<br>
> +<br>
> +<br>
> +; In this test case, the codesize cost of the instructions before the call to<br>
> +; bar() is equal to the default DuplicationThreshold of 5, because calls are<br>
> +; more expensive.<br>
> +define void @test_no_split_threshold(i32* %ptrarg, i32 %i) {<br>
> +Header:<br>
> +  %tobool = icmp ne i32* %ptrarg, null<br>
> +  br i1 %tobool, label %TBB, label %CallSite<br>
> +<br>
> +TBB:                                    ; preds = %Header<br>
> +  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42<br>
> +  %0 = load i32, i32* %arrayidx, align 4<br>
> +  %tobool1 = icmp ne i32 %0, 0<br>
> +  br i1 %tobool1, label %CallSite, label %End<br>
> +<br>
> +CallSite:                                          ; preds = %TBB, %Header<br>
> +  %i2 = add i32 %i, 10<br>
> +  call void @bari(i32 %i2)<br>
> +  call void @bari(i32 %i2)<br>
> +  call void @bar(i32* %ptrarg, i32 %i2)<br>
> +  br label %End<br>
> +<br>
> +End:                                           ; preds = %CallSite, %TBB<br>
> +  ret void<br>
> +}<br>
> +; NODUP-LABEL: test_no_split_threshold<br>
> +; NODUP-NOT: split<br>
> +; CHECK-LABEL: test_no_split_threshold<br>
> +; CHECK-NOT: split<br>
> +; CHECK-LABEL: CallSite:<br>
> +; CHECK: call void @bar(i32* %ptrarg, i32 %i2)<br>
> +<br>
> +; In this test case, the phi node %l in CallSite should be removed, as after<br>
> +; moving the call to the split blocks we can use the values directly.<br>
> +define void @test_remove_unused_phi(i32* %ptrarg, i32 %i) {<br>
> +Header:<br>
> +  %l1 = load i32, i32* undef, align 16<br>
> +  %tobool = icmp ne i32* %ptrarg, null<br>
> +  br i1 %tobool, label %TBB, label %CallSite<br>
> +<br>
> +TBB:                                    ; preds = %Header<br>
> +  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42<br>
> +  %0 = load i32, i32* %arrayidx, align 4<br>
> +  %l2 = load i32, i32* undef, align 16<br>
> +  %tobool1 = icmp ne i32 %0, 0<br>
> +  br i1 %tobool1, label %CallSite, label %End<br>
> +<br>
> +CallSite:                                          ; preds = %TBB, %Header<br>
> +  %l = phi i32 [ %l1, %Header ], [ %l2, %TBB ]<br>
> +  call void @bar(i32* %ptrarg, i32 %l)<br>
> +  br label %End<br>
> +<br>
> +End:                                           ; preds = %CallSite, %TBB<br>
> +  ret void<br>
> +}<br>
> +; NODUP-LABEL: test_remove_unused_phi<br>
> +; NODUP-NOT: split<br>
> +; CHECK-LABEL: test_remove_unused_phi<br>
> +; CHECK-LABEL: Header.split<br>
> +; CHECK: call void @bar(i32* null, i32 %l1)<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK-LABEL: TBB.split:<br>
> +; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %l2)<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK-LABEL: CallSite:<br>
> +; CHECK-NOT: phi<br>
> +<br>
> +; In this test case, we need to insert a new PHI node in TailBB to combine<br>
> +; the loads we moved to the predecessors.<br>
> +define void @test_add_new_phi(i32* %ptrarg, i32 %i) {<br>
> +Header:<br>
> +  %tobool = icmp ne i32* %ptrarg, null<br>
> +  br i1 %tobool, label %TBB, label %CallSite<br>
> +<br>
> +TBB:<br>
> +  br i1 undef, label %CallSite, label %End<br>
> +<br>
> +CallSite:<br>
> +  %arrayidx112 = getelementptr inbounds i32, i32* undef, i64 1<br>
> +  %0 = load i32, i32* %arrayidx112, align 4<br>
> +  call void @bar(i32* %ptrarg, i32 %i)<br>
> +  %sub = sub nsw i32 %0, undef<br>
> +  br label %End<br>
> +<br>
> +End:                                           ; preds = %CallSite, %TBB<br>
> +  ret void<br>
> +}<br>
> +; NODUP-LABEL: test_add_new_phi<br>
> +; NODUP-NOT: split<br>
> +; CHECK-LABEL: test_add_new_phi<br>
> +; CHECK-LABEL: Header.split<br>
> +; CHECK: %[[V1:.+]] = load i32, i32*<br>
> +; CHECK: call void @bar(i32* null, i32 %i)<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK-LABEL: TBB.split:<br>
> +; CHECK: %[[V2:.+]] = load i32, i32*<br>
> +; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %i)<br>
> +; CHECK: br label %CallSite<br>
> +; CHECK-LABEL: CallSite:<br>
> +; CHECK-NEXT: %[[V3:.+]] = phi i32 [ %[[V1]], %Header.split ], [ %[[V2]], %TBB.split ]<br>
> +; CHECK: %sub = sub nsw i32 %[[V3]], undef<br>
> +<br>
> +define i32 @test_firstnophi(i32* %a, i32 %v) {<br>
> +Header:<br>
> +  %tobool1 = icmp eq i32* %a, null<br>
> +  br i1 %tobool1, label %Tail, label %TBB<br>
> +<br>
> +TBB:<br>
> +  %cmp = icmp eq i32 %v, 1<br>
> +  br i1 %cmp, label %Tail, label %End<br>
> +<br>
> +Tail:<br>
> +  %p = phi i32[1,%Header], [2, %TBB]<br>
> +  store i32 %v, i32* %a<br>
> +  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)<br>
> +  ret i32 %r<br>
> +<br>
> +End:<br>
> +  ret i32 %v<br>
> +}<br>
> +; NODUP-LABEL: @test_firstnophi<br>
> +; NODUP-NOT: split:<br>
> +; CHECK-LABEL: @test_firstnophi<br>
> +; CHECK-LABEL: Header.split:<br>
> +; CHECK-NEXT: store i32 %v, i32* %a<br>
> +; CHECK-NEXT: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)<br>
> +; CHECK-NEXT: br label %Tail<br>
> +; CHECK-LABEL: TBB.split:<br>
> +; CHECK-NEXT: store i32 %v, i32* %a<br>
> +; CHECK-NEXT: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)<br>
> +; CHECK-NEXT br label %Tail<br>
> +; CHECK-LABEL: Tail:<br>
> +; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
> +; CHECK: ret i32 %[[MERGED]]<br>
> +define i32 @callee(i32* %a, i32 %v, i32 %p) {<br>
> +    ret i32 0<br>
> +}<br>
> +<br>
> +define void @test_no_remove_used_phi(i32* %ptrarg, i32 %i) {<br>
> +Header:<br>
> +  %l1 = load i32, i32* undef, align 16<br>
> +  %tobool = icmp ne i32* %ptrarg, null<br>
> +  br i1 %tobool, label %TBB, label %CallSite<br>
> +<br>
> +TBB:                                    ; preds = %Header<br>
> +  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42<br>
> +  %0 = load i32, i32* %arrayidx, align 4<br>
> +  %l2 = load i32, i32* undef, align 16<br>
> +  %tobool1 = icmp ne i32 %0, 0<br>
> +  br i1 %tobool1, label %CallSite, label %End<br>
> +<br>
> +CallSite:                                          ; preds = %TBB, %Header<br>
> +  %l = phi i32 [ %l1, %Header ], [ %l2, %TBB ]<br>
> +  call void @bar(i32* %ptrarg, i32 %l)<br>
> +  call void @bari(i32 %l)<br>
> +  br label %End<br>
> +<br>
> +End:                                           ; preds = %CallSite, %TBB<br>
> +  ret void<br>
> +}<br>
> +; NODUP-LABEL: @test_no_remove_used_phi<br>
> +; NODUP-NOT: split<br>
> +; CHECK-LABEL: @test_no_remove_used_phi<br>
> +; CHECK-LABEL: Header.split:<br>
> +; CHECK: call void @bar(i32* null, i32 %l1)<br>
> +; CHECK-NEXT: br label %CallSite<br>
> +; CHECK-LABEL: TBB.split:<br>
> +; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %l2)<br>
> +; CHECK-NEXT br label %CallSite<br>
> +; CHECK-LABEL: CallSite:<br>
> +; CHECK-NEXT:  %l = phi i32 [ %l1, %Header.split ], [ %l2, %TBB.split ]<br>
> +; CHECK: call void @bari(i32 %l)<br>
> +<br>
> +define void @bar(i32*, i32) {<br>
> +    ret void<br>
> +}<br>
> +<br>
> +define  void @bari(i32) {<br>
> +    ret void<br>
> +}<br>
> <br>
> Modified: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll?rev=325126&r1=325125&r2=325126&view=diff">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll?rev=325126&r1=325125&r2=325126&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll (original)<br>
> +++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll Wed Feb 14 05:59:12 2018<br>
> @@ -3,15 +3,15 @@<br>
>   <br>
>   ; CHECK-LABEL: @test_simple<br>
>   ; CHECK-LABEL: Header:<br>
> -; CHECK-NEXT: br i1 undef, label %Tail.predBB.split<br>
> -; CHECK-LABEL: TBB:<br>
> -; CHECK: br i1 %cmp, label %Tail.predBB.split1<br>
> -; CHECK-LABEL: Tail.predBB.split:<br>
> +; CHECK-NEXT: br i1 undef, label %Header.split<br>
> +; CHECK-LABEL: Header.split:<br>
>   ; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)<br>
> -; CHECK-LABEL: Tail.predBB.split1:<br>
> +; CHECK-LABEL: TBB:<br>
> +; CHECK: br i1 %cmp, label %TBB.split<br>
> +; CHECK-LABEL: TBB.split:<br>
>   ; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 %p)<br>
>   ; CHECK-LABEL: Tail<br>
> -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ; CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_simple(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -31,15 +31,15 @@ End:<br>
>   <br>
>   ; CHECK-LABEL: @test_eq_eq_eq_untaken<br>
>   ; CHECK-LABEL: Header:<br>
> -; CHECK: br i1 %tobool1, label %TBB1, label %Tail.predBB.split<br>
> -; CHECK-LABEL: TBB2:<br>
> -; CHECK: br i1 %cmp2, label %Tail.predBB.split1, label %End<br>
> -; CHECK-LABEL: Tail.predBB.split:<br>
> +; CHECK: br i1 %tobool1, label %TBB1, label %Header.split<br>
> +; CHECK-LABEL: Header.split:<br>
>   ; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)<br>
> -; CHECK-LABEL: Tail.predBB.split1:<br>
> +; CHECK-LABEL: TBB2:<br>
> +; CHECK: br i1 %cmp2, label %TBB2.split, label %End<br>
> +; CHECK-LABEL: TBB2.split:<br>
>   ; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 99)<br>
>   ; CHECK-LABEL: Tail<br>
> -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ]<br>
>   ; CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_eq_eq_eq_untaken2(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -64,15 +64,15 @@ End:<br>
>   <br>
>   ; CHECK-LABEL: @test_eq_ne_eq_untaken<br>
>   ; CHECK-LABEL: Header:<br>
> -; CHECK: br i1 %tobool1, label %TBB1, label %Tail.predBB.split<br>
> -; CHECK-LABEL: TBB2:<br>
> -; CHECK: br i1 %cmp2, label %Tail.predBB.split1, label %End<br>
> -; CHECK-LABEL: Tail.predBB.split:<br>
> +; CHECK: br i1 %tobool1, label %TBB1, label %Header.split<br>
> +; CHECK-LABEL: Header.split:<br>
>   ; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)<br>
> -; CHECK-LABEL: Tail.predBB.split1:<br>
> +; CHECK-LABEL: TBB2:<br>
> +; CHECK: br i1 %cmp2, label %TBB2.split, label %End<br>
> +; CHECK-LABEL: TBB2.split:<br>
>   ; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 99)<br>
>   ; CHECK-LABEL: Tail<br>
> -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ]<br>
>   ; CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_eq_ne_eq_untaken(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -97,17 +97,17 @@ End:<br>
>   <br>
>   ; CHECK-LABEL: @test_header_header2_tbb<br>
>   ; CHECK: Header2:<br>
> -; CHECK:br i1 %tobool2, label %Tail.predBB.split, label %TBB1<br>
> -; CHECK-LABEL: TBB2:<br>
> -; CHECK: br i1 %cmp2, label %Tail.predBB.split1, label %End<br>
> -; CHECK-LABEL: Tail.predBB.split:<br>
> +; CHECK:br i1 %tobool2, label %Header2.split, label %TBB1<br>
> +; CHECK-LABEL: Header2.split:<br>
>   ; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)<br>
> -; CHECK-LABEL: Tail.predBB.split1:<br>
> +; CHECK-LABEL: TBB2:<br>
> +; CHECK: br i1 %cmp2, label %TBB2.split, label %End<br>
> +; CHECK-LABEL: TBB2.split:<br>
>   ; NOTE: CallSiteSplitting cannot infer that %a is null here, as it currently<br>
>   ;       only supports recording conditions along a single predecessor path.<br>
>   ; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 99)<br>
>   ; CHECK-LABEL: Tail<br>
> -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB2.split ]<br>
>   ; CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_header_header2_tbb(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> <br>
> Modified: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll?rev=325126&r1=325125&r2=325126&view=diff">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll?rev=325126&r1=325125&r2=325126&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll (original)<br>
> +++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll Wed Feb 14 05:59:12 2018<br>
> @@ -48,10 +48,9 @@ attributes #0 = { nounwind readnone spec<br>
>   ; CallSiteBB.<br>
>   <br>
>   ; CHECK-LABEL: @foo<br>
> -; CHECK-LABEL: CallsiteBB.predBB.split:<br>
> -; CHECK: [[TMP1:%[0-9]+]] = call i16 @bar(i16 1, i16 5)<br>
> -; CHECK-LABEL: CallsiteBB.predBB.split1:<br>
> -; CHECK: [[TMP2:%[0-9]+]] = call i16 @bar(i16 0, i16 5)<br>
> +; CHECK-LABEL: bb1.split:<br>
> +; CHECK: [[TMP1:%[0-9]+]] = call i16 @bar(i16 0, i16 5)<br>
> +; CHECK-LABEL: bb2.split:<br>
> +; CHECK: [[TMP2:%[0-9]+]] = call i16 @bar(i16 1, i16 5)<br>
>   ; CHECK-LABEL: CallsiteBB<br>
> -; CHECK: %phi.call = phi i16 [ [[TMP1]], %CallsiteBB.predBB.split ], [ [[TMP2]], %CallsiteBB.predBB.split1<br>
> -<br>
> +; CHECK: %phi.call = phi i16 [ [[TMP2]], %bb2.split ], [ [[TMP1]], %bb1.split<br>
> <br>
> Modified: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll?rev=325126&r1=325125&r2=325126&view=diff">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll?rev=325126&r1=325125&r2=325126&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll (original)<br>
> +++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll Wed Feb 14 05:59:12 2018<br>
> @@ -5,13 +5,17 @@ target datalayout = "e-m:e-i8:8:32-i16:1<br>
>   target triple = "aarch64-linaro-linux-gnueabi"<br>
>   <br>
>   ;CHECK-LABEL: @test_eq_eq<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +<br>
> +;CHECK-LABEL: Header:<br>
> +;CHECK: br i1 %tobool1, label %Header.split, label %TBB<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB:<br>
> +;CHECK: br i1 %cmp, label %TBB.split, label %End<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_eq_eq(i32* %a, i32 %v) {<br>
>   Header:<br>
> @@ -32,12 +36,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_eq_eq_eq<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header2.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 %p)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_eq_eq_eq(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -61,12 +65,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_eq_eq_eq_constrain_same_i32_arg<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header2.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 222, i32 %p)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 333, i32 %p)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_eq_eq_eq_constrain_same_i32_arg(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -90,13 +94,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_ne_eq<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_ne_eq(i32* %a, i32 %v) {<br>
>   Header:<br>
> @@ -117,12 +120,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_ne_eq_ne<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header2.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_ne_eq_ne(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -146,13 +149,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_ne_ne<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_ne_ne(i32* %a, i32 %v) {<br>
>   Header:<br>
> @@ -173,12 +175,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_ne_ne_ne_constrain_same_pointer_arg<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header2.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_ne_ne_ne_constrain_same_pointer_arg(i32* %a, i32 %v, i32 %p, i32* %a2, i32* %a3) {<br>
>   Header:<br>
> @@ -204,13 +206,12 @@ End:<br>
>   <br>
>   <br>
>   ;CHECK-LABEL: @test_eq_eq_untaken<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_eq_eq_untaken(i32* %a, i32 %v) {<br>
>   Header:<br>
> @@ -231,12 +232,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_eq_eq_eq_untaken<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header2.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 %p)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_eq_eq_eq_untaken(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -260,13 +261,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_ne_eq_untaken<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_ne_eq_untaken(i32* %a, i32 %v) {<br>
>   Header:<br>
> @@ -287,12 +287,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_ne_eq_ne_untaken<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header2.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 %p)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_ne_eq_ne_untaken(i32* %a, i32 %v, i32 %p) {<br>
>   Header:<br>
> @@ -316,13 +316,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_ne_ne_untaken<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_ne_ne_untaken(i32* %a, i32 %v) {<br>
>   Header:<br>
> @@ -343,13 +342,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_nonconst_const_phi<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_nonconst_const_phi(i32* %a, i32* %b, i32 %v) {<br>
>   Header:<br>
> @@ -370,13 +368,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_nonconst_nonconst_phi<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)<br>
> +;CHECK-LABEL: Header.split:<br>
> +;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)<br>
> +;CHECK-LABEL: TBB.split:<br>
> +;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 2, %Tail.predBB.split ], [ 1, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB.split ], [ %[[CALL1]], %Header.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_nonconst_nonconst_phi(i32* %a, i32* %b, i32 %v, i32 %v2) {<br>
>   Header:<br>
> @@ -397,13 +394,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_cfg_no_or_phi<br>
> -;CHECK-LABEL: Tail.predBB.split<br>
> -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)<br>
> +;CHECK-LABEL: TBB0.split<br>
> +;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)<br>
> +;CHECK-LABEL: TBB1.split:<br>
> +;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %p = phi i32 [ 2, %Tail.predBB.split ], [ 1, %Tail.predBB.split1 ]<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB1.split ], [ %[[CALL1]], %TBB0.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_cfg_no_or_phi(i32* %a,  i32 %v) {<br>
>   entry:<br>
> @@ -421,8 +417,8 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_nonconst_nonconst_phi_noncost<br>
> -;CHECK-NOT: Tail.predBB.split:<br>
> -;CHECK-NOT: Tail.predBB.split1:<br>
> +;CHECK-NOT: Header.split:<br>
> +;CHECK-NOT: TBB.split:<br>
>   ;CHECK-LABEL: Tail:<br>
>   ;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)<br>
>   ;CHECK: ret i32 %r<br>
> @@ -444,34 +440,9 @@ End:<br>
>     ret i32 %v<br>
>   }<br>
>   <br>
> -;CHECK-LABEL: @test_fisrtnonphi<br>
> -;CHECK-NOT: Tail.predBB.split:<br>
> -;CHECK-NOT: Tail.predBB.split1:<br>
> -;CHECK-LABEL: Tail:<br>
> -;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)<br>
> -;CHECK: ret i32 %r<br>
> -define i32 @test_fisrtnonphi(i32* %a, i32 %v) {<br>
> -Header:<br>
> -  %tobool1 = icmp eq i32* %a, null<br>
> -  br i1 %tobool1, label %Tail, label %TBB<br>
> -<br>
> -TBB:<br>
> -  %cmp = icmp eq i32 %v, 1<br>
> -  br i1 %cmp, label %Tail, label %End<br>
> -<br>
> -Tail:<br>
> -  %p = phi i32[1,%Header], [2, %TBB]<br>
> -  store i32 %v, i32* %a<br>
> -  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)<br>
> -  ret i32 %r<br>
> -<br>
> -End:<br>
> -  ret i32 %v<br>
> -}<br>
> -<br>
>   ;CHECK-LABEL: @test_3preds_constphi<br>
> -;CHECK-NOT: Tail.predBB.split:<br>
> -;CHECK-NOT: Tail.predBB.split1:<br>
> +;CHECK-NOT: Header.split:<br>
> +;CHECK-NOT: TBB.split:<br>
>   ;CHECK-LABEL: Tail:<br>
>   ;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)<br>
>   ;CHECK: ret i32 %r<br>
> @@ -495,8 +466,8 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_indirectbr_phi<br>
> -;CHECK-NOT: Tail.predBB.split:<br>
> -;CHECK-NOT: Tail.predBB.split1:<br>
> +;CHECK-NOT: Header.split:<br>
> +;CHECK-NOT: TBB.split:<br>
>   ;CHECK-LABEL: Tail:<br>
>   ;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)<br>
>   ;CHECK: ret i32 %r<br>
> @@ -519,12 +490,12 @@ End:<br>
>   }<br>
>   <br>
>   ;CHECK-LABEL: @test_unreachable<br>
> -;CHECK-LABEL: Tail.predBB.split:<br>
> +;CHECK-LABEL: Header.split:<br>
>   ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10)<br>
> -;CHECK-LABEL: Tail.predBB.split1:<br>
> +;CHECK-LABEL: TBB.split:<br>
>   ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)<br>
>   ;CHECK-LABEL: Tail<br>
> -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]<br>
> +;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]<br>
>   ;CHECK: ret i32 %[[MERGED]]<br>
>   define i32 @test_unreachable(i32* %a, i32 %v, i32 %p) {<br>
>   Entry:<br>
> <br>
> Modified: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll?rev=325126&r1=325125&r2=325126&view=diff">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll?rev=325126&r1=325125&r2=325126&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll (original)<br>
> +++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll Wed Feb 14 05:59:12 2018<br>
> @@ -7,10 +7,10 @@ target triple = "aarch64-linaro-linux-gn<br>
>   %struct.bitmap = type { i32, %struct.bitmap* }<br>
>   <br>
>   ;CHECK-LABEL: @caller<br>
> +;CHECK-LABEL: Top.split:<br>
> +;CHECK: call void @callee(%struct.bitmap* null, %struct.bitmap* null, %struct.bitmap* %b_elt, i1 false)<br>
>   ;CHECK-LABEL: NextCond:<br>
>   ;CHECK: br {{.*}} label %callee.exit<br>
> -;CHECK-LABEL: CallSiteBB.predBB.split:<br>
> -;CHECK: call void @callee(%struct.bitmap* null, %struct.bitmap* null, %struct.bitmap* %b_elt, i1 false)<br>
>   ;CHECK-LABEL: callee.exit:<br>
>   ;CHECK: call void @dummy2(%struct.bitmap* %a_elt)<br>
>   <br>
> @@ -69,12 +69,12 @@ declare void @dummy1(%struct.bitmap*, %s<br>
>   <br>
>   <br>
>   ;CHECK-LABEL: @caller2<br>
> -;CHECK-LABEL: CallSiteBB.predBB.split:<br>
> -;CHECK: call void @dummy3()<br>
> -;CHECK-LABEL: CallSiteBB.predBB.split1:<br>
> +;CHECK-LABEL: Top.split:<br>
>   ;CHECK: call void @dummy4()<br>
> +;CHECK-LABEL: NextCond.split:<br>
> +;CHECK: call void @dummy3()<br>
>   ;CheCK-LABEL: CallSiteBB:<br>
> -;CHECK: %phi.call = phi i1 [ true, %CallSiteBB.predBB.split ], [ false, %CallSiteBB.predBB.split1 ]<br>
> +;CHECK: %phi.call = phi i1 [ true, %NextCond.split ], [ false, %Top.split ]<br>
>   ;CHECK: call void @foo(i1 %phi.call)<br>
>   define void @caller2(i1 %c, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, %struct.bitmap* %c_elt) {<br>
>   entry:<br>
> <br>
> <br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> llvm-commits@lists.llvm.org<br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
> <br>
</div>
</span></font></div>
</body>
</html>