[MergedLoadStoreMotion] Sink stores to BB with more than 2 predecessors
authorDenis Bakhvalov <denis.bakhvalov@intel.com>
Thu, 5 Sep 2019 17:00:32 +0000 (17:00 +0000)
committerDenis Bakhvalov <denis.bakhvalov@intel.com>
Thu, 5 Sep 2019 17:00:32 +0000 (17:00 +0000)
commit58f172f05ae0d6d4fa6a222d04fa59fc98807489
treef3dcc9c1a8df2eb566c6628bb34133c84a3e5ef4
parent3856512334ee525d5c922b0480b7503210cc4bb3
[MergedLoadStoreMotion] Sink stores to BB with more than 2 predecessors

If we have:

bb5:
  br i1 %arg3, label %bb6, label %bb7

bb6:
  %tmp = getelementptr inbounds i32, i32* %arg1, i64 2
  store i32 3, i32* %tmp, align 4
  br label %bb9

bb7:
  %tmp8 = getelementptr inbounds i32, i32* %arg1, i64 2
  store i32 3, i32* %tmp8, align 4
  br label %bb9

bb9:  ; preds = %bb4, %bb6, %bb7
  ...

We can't sink stores directly into bb9.
This patch creates new BB that is successor of %bb6 and %bb7
and sinks stores into that block.

SplitFooterBB is the parameter to the pass that controls
that behavior.

Change-Id: I7fdf50a772b84633e4b1b860e905bf7e3e29940f
Differential: https://reviews.llvm.org/D66234
llvm-svn: 371089
llvm/include/llvm/Transforms/Scalar.h
llvm/include/llvm/Transforms/Scalar/MergedLoadStoreMotion.h
llvm/lib/Passes/PassBuilder.cpp
llvm/lib/Passes/PassRegistry.def
llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp
llvm/test/Transforms/InstMerge/st_sink_split_bb.ll [new file with mode: 0644]