HomePhabricator

[DAGCombiner] Fold BRCOND(FREEZE(COND)) to BRCOND(COND)

Authored by aqjune on Jan 12 2021, 4:33 PM.

Description

[DAGCombiner] Fold BRCOND(FREEZE(COND)) to BRCOND(COND)

This patch resolves the suboptimal codegen described in http://llvm.org/pr47873 .
When CodeGenPrepare lowers select into a conditional branch, a freeze instruction is inserted.
It is then translated to BRCOND(FREEZE(SETCC)) in SelDag.
The FREEZE in the middle of SETCC and BRCOND was causing a suboptimal code generation however.
This patch adds BRCOND(FREEZE(cond)) -> BRCOND(cond) fold to DAGCombiner to remove the FREEZE.

To make this optimization sound, BRCOND(UNDEF) simply should nondeterministically jump to the branch or not, rather than raising UB.
It wasn't clear what happens when the condition was undef according to the comments in ISDOpcodes.h, however.
I updated the comments of BRCOND to make it explicit (as well as BR_CC, which is also a conditional branch instruction).

Note that it diverges from the semantics of br instruction in IR, which is explicitly UB.
Since the UB semantics was necessary to explain optimizations that use branching conditions, and SelDag doesn't seem to have such optimization, I think this divergence is okay.

Reviewed By: spatel

Differential Revision: https://reviews.llvm.org/D92015

Details

Committed
aqjuneJan 12 2021, 4:36 PM
Reviewer
spatel
Differential Revision
D92015: [DAGCombiner] Fold BRCOND(FREEZE(COND)) to BRCOND(COND)
Parents
rG76643c48cddd: [LangRef] State that a nocapture pointer cannot be returned
Branches
Unknown
Tags
Unknown