aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/Signposts.cpp
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-01-16 12:41:35 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-01-19 20:26:38 +0100
commit21443381c00d9d5ddd6a73f2f839dc4872d79463 (patch)
tree4be4ed80c6014ccb6dd94577206a272c1b388df4 /llvm/lib/Support/Signposts.cpp
parentbedbb58203cd67a46f64a0182dc1e6717b3c536c (diff)
downloadllvm-21443381c00d9d5ddd6a73f2f839dc4872d79463.zip
llvm-21443381c00d9d5ddd6a73f2f839dc4872d79463.tar.gz
llvm-21443381c00d9d5ddd6a73f2f839dc4872d79463.tar.bz2
Reapply [InstCombine] Replace one-use select operand based on condition
Relative to the original change, this adds a check that the instruction on which we're replacing operands is safe to speculatively execute, because that's what we're effectively doing. We're executing the instruction with the replaced operand, which is fine if it's pure, but not fine if can cause side-effects or UB (aka is not speculatable). Additionally, we cannot (generally) replace operands in phi nodes, as these may refer to a different loop iteration. This is also covered by the speculation check. ----- InstCombine already performs a fold where X == Y ? f(X) : Z is transformed to X == Y ? f(Y) : Z if f(Y) simplifies. However, if f(X) only has one use, then we can always directly replace the use inside the instruction. To actually be profitable, limit it to the case where Y is a non-expr constant. This could be further extended to replace uses further up a one-use instruction chain, but for now this only looks one level up. Among other things, this also subsumes D94860. Differential Revision: https://reviews.llvm.org/D94862
Diffstat (limited to 'llvm/lib/Support/Signposts.cpp')
0 files changed, 0 insertions, 0 deletions