Add an @llvm.sideeffect intrinsic
authorDan Gohman <dan433584@gmail.com>
Wed, 8 Nov 2017 21:59:51 +0000 (21:59 +0000)
committerDan Gohman <dan433584@gmail.com>
Wed, 8 Nov 2017 21:59:51 +0000 (21:59 +0000)
commit2c74fe977daf8d1d4c8b64cdd6d3a9999a4b4655
tree98b7ec31ec1bfdcc6869e3d884d44bc273bde172
parentc707c6f3a70f18ef8ceb1badea1de9965ce97e06
Add an @llvm.sideeffect intrinsic

This patch implements Chandler's idea [0] for supporting languages that
require support for infinite loops with side effects, such as Rust, providing
part of a solution to bug 965 [1].

Specifically, it adds an `llvm.sideeffect()` intrinsic, which has no actual
effect, but which appears to optimization passes to have obscure side effects,
such that they don't optimize away loops containing it. It also teaches
several optimization passes to ignore this intrinsic, so that it doesn't
significantly impact optimization in most cases.

As discussed on llvm-dev [2], this patch is the first of two major parts.
The second part, to change LLVM's semantics to have defined behavior
on infinite loops by default, with a function attribute for opting into
potential-undefined-behavior, will be implemented and posted for review in
a separate patch.

[0] http://lists.llvm.org/pipermail/llvm-dev/2015-July/088103.html
[1] https://bugs.llvm.org/show_bug.cgi?id=965
[2] http://lists.llvm.org/pipermail/llvm-dev/2017-October/118632.html

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

llvm-svn: 317729
31 files changed:
llvm/docs/LangRef.rst
llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
llvm/include/llvm/CodeGen/BasicTTIImpl.h
llvm/include/llvm/IR/Intrinsics.td
llvm/lib/Analysis/AliasSetTracker.cpp
llvm/lib/Analysis/ValueTracking.cpp
llvm/lib/Analysis/VectorUtils.cpp
llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/lib/Transforms/Scalar/EarlyCSE.cpp
llvm/lib/Transforms/Scalar/GVNHoist.cpp
llvm/lib/Transforms/Utils/Evaluator.cpp
llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/CodeGen/Generic/intrinsics.ll
llvm/test/Transforms/DCE/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/DeadStoreElimination/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/EarlyCSE/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/FunctionAttrs/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/GVN/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/GVNHoist/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/GVNSink/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/GlobalOpt/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/InstCombine/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/LICM/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/LoadStoreVectorizer/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/LoopIdiom/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/LoopVectorize/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/NewGVN/int_sideeffect.ll [new file with mode: 0644]
llvm/test/Transforms/SLPVectorizer/int_sideeffect.ll [new file with mode: 0644]