1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00
Go to file
Juneyoung Lee 3333999419 [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
2021-01-13 09:36:52 +09:00
benchmarks
bindings
cmake [CMake] Fix incorrect rpath for tests if LLVM_LOCAL_RPATH isn't set 2021-01-08 21:24:18 +02:00
docs [LangRef] State that a nocapture pointer cannot be returned 2021-01-13 09:30:54 +09:00
examples
include [DAGCombiner] Fold BRCOND(FREEZE(COND)) to BRCOND(COND) 2021-01-13 09:36:52 +09:00
lib [DAGCombiner] Fold BRCOND(FREEZE(COND)) to BRCOND(COND) 2021-01-13 09:36:52 +09:00
projects
resources
runtimes [CMake] Split the target side of runtimes build 2021-01-11 23:39:36 -08:00
test [DAGCombiner] Fold BRCOND(FREEZE(COND)) to BRCOND(COND) 2021-01-13 09:36:52 +09:00
tools [obj2yaml] - Don't crash when an object has an empty symbol table. 2021-01-12 14:08:59 +03:00
unittests [AMDGPU] Add _e64 suffix to VOP3 Insts 2021-01-12 18:33:18 -05:00
utils [llvm] Simplify string comparisons (NFC) 2021-01-11 18:48:09 -08:00
.clang-format
.clang-tidy
.gitattributes
.gitignore
CMakeLists.txt [llvm] [cmake] Remove obsolete /usr/local hack for *BSD 2021-01-12 19:26:04 +01:00
CODE_OWNERS.TXT
configure
CREDITS.TXT
LICENSE.TXT
llvm.spec.in
README.txt
RELEASE_TESTERS.TXT

The LLVM Compiler Infrastructure
================================

This directory and its subdirectories contain source code for LLVM,
a toolkit for the construction of highly optimized compilers,
optimizers, and runtime environments.

LLVM is open source software. You may freely distribute it under the terms of
the license agreement found in LICENSE.txt.

Please see the documentation provided in docs/ for further
assistance with LLVM, and in particular docs/GettingStarted.rst for getting
started with LLVM and docs/README.txt for an overview of LLVM's
documentation setup.

If you are writing a package for LLVM, see docs/Packaging.rst for our
suggestions.