1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
llvm-mirror/test/Transforms/GVN/int_sideeffect.ll
Dan Gohman 39c48b9d3e 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
2017-11-08 21:59:51 +00:00

52 lines
1.1 KiB
LLVM

; RUN: opt -S < %s -gvn | FileCheck %s
declare void @llvm.sideeffect()
; Store-to-load forwarding across a @llvm.sideeffect.
; CHECK-LABEL: s2l
; CHECK-NOT: load
define float @s2l(float* %p) {
store float 0.0, float* %p
call void @llvm.sideeffect()
%t = load float, float* %p
ret float %t
}
; Redundant load elimination across a @llvm.sideeffect.
; CHECK-LABEL: rle
; CHECK: load
; CHECK-NOT: load
define float @rle(float* %p) {
%r = load float, float* %p
call void @llvm.sideeffect()
%s = load float, float* %p
%t = fadd float %r, %s
ret float %t
}
; LICM across a @llvm.sideeffect.
; CHECK-LABEL: licm
; CHECK: load
; CHECK: loop:
; CHECK-NOT: load
define float @licm(i64 %n, float* nocapture readonly %p) #0 {
bb0:
br label %loop
loop:
%i = phi i64 [ 0, %bb0 ], [ %t5, %loop ]
%sum = phi float [ 0.000000e+00, %bb0 ], [ %t4, %loop ]
call void @llvm.sideeffect()
%t3 = load float, float* %p
%t4 = fadd float %sum, %t3
%t5 = add i64 %i, 1
%t6 = icmp ult i64 %t5, %n
br i1 %t6, label %loop, label %bb2
bb2:
ret float %t4
}