[llvm-dev] Basic block merging
David Jones via llvm-dev
llvm-dev at lists.llvm.org
Wed May 29 08:49:09 PDT 2019
Under certain circumstances, my compiler outputs basic blocks having the
same function:
bb_97: ; preds = %bb_1
%476 = getelementptr inbounds %LMtop.I0.ARType, %LMtop.I0.ARType* %0, i64
0, i32 6
%477 = bitcast i8** %476 to %LBstd.Cprocess.CRType**
%478 = load %LBstd.Cprocess.CRType*, %LBstd.Cprocess.CRType** %477, align
8
%479 = getelementptr inbounds %LBstd.Cprocess.CRType,
%LBstd.Cprocess.CRType* %478, i64 0, i32 3
%480 = bitcast i8** %479 to %LMtop.I0.ARType**
store %LMtop.I0.ARType* %0, %LMtop.I0.ARType** %480, align 8
br label %bb_106
bb_98: ; preds = %bb_1
%481 = getelementptr inbounds %LMtop.I0.ARType, %LMtop.I0.ARType* %0, i64
0, i32 6
%482 = bitcast i8** %481 to %LBstd.Cprocess.CRType**
%483 = load %LBstd.Cprocess.CRType*, %LBstd.Cprocess.CRType** %482, align
8
%484 = getelementptr inbounds %LBstd.Cprocess.CRType,
%LBstd.Cprocess.CRType* %483, i64 0, i32 3
%485 = bitcast i8** %484 to %LMtop.I0.ARType**
store %LMtop.I0.ARType* %0, %LMtop.I0.ARType** %485, align 8
br label %bb_106
These blocks have provably the same function - the instructions of one
correspond perfectly to instructions in the other.
I would have expected some optimization to detect this, and merge the
blocks by forwarding all jumps to one, to jump to the other.
I notice a "merge functions" pass, which does this if two functions can be
proven to have identical effect.
Is there a pass that merges blocks? Is it enabled by default? If so, then
is there something non-obvious in the code that would be defeating this
optimization?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190529/960a01a3/attachment.html>
More information about the llvm-dev
mailing list