diff options
author | Evan Cheng <evan.cheng@apple.com> | 2011-12-19 22:01:30 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2011-12-19 22:01:30 +0000 |
commit | 4266a7935191d8111e6bfa0de2ce0eec98678201 (patch) | |
tree | 4d378b415ce9379349d65750a5d9cb3ba894a71c /clang/lib/AST/ExprConstant.cpp | |
parent | 6dbc17dffebdde1edb296de1fd335d9965fa4f2a (diff) | |
download | bcm5719-llvm-4266a7935191d8111e6bfa0de2ce0eec98678201.tar.gz bcm5719-llvm-4266a7935191d8111e6bfa0de2ce0eec98678201.zip |
Add a if-conversion optimization that allows 'true' side of a diamond to be
unpredicated. That is, turn
subeq r0, r1, #1
addne r0, r1, #1
into
sub r0, r1, #1
addne r0, r1, #1
For targets where conditional instructions are always executed, this may be
beneficial. It may remove pseudo anti-dependency in out-of-order execution
CPUs. e.g.
op r1, ...
str r1, [r10] ; end-of-life of r1 as div result
cmp r0, #65
movne r1, #44 ; raw dependency on previous r1
moveq r1, #12
If movne is unpredicated, then
op r1, ...
str r1, [r10]
cmp r0, #65
mov r1, #44 ; r1 written unconditionally
moveq r1, #12
Both mov and moveq are no longer depdendent on the first instruction. This gives
the out-of-order execution engine more freedom to reorder them.
This has passed entire LLVM test suite. But it has not been enabled for any ARM
variant pending more performance evaluation.
rdar://8951196
llvm-svn: 146914
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
0 files changed, 0 insertions, 0 deletions