16 changes: 16 additions & 0 deletions llvm/test/Transforms/GlobalOpt/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
; RUN: opt -S < %s -globalopt | FileCheck %s

; Static evaluation across a @llvm.sideeffect.

; CHECK-NOT: store

declare void @llvm.sideeffect()

@llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @ctor } ]
@G = global i32 0

define internal void @ctor() {
store i32 1, i32* @G
call void @llvm.sideeffect()
ret void
}
14 changes: 14 additions & 0 deletions llvm/test/Transforms/InstCombine/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
; RUN: opt -S < %s -instcombine | 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
}
27 changes: 27 additions & 0 deletions llvm/test/Transforms/LICM/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
; RUN: opt -S < %s -licm | FileCheck %s

declare void @llvm.sideeffect()

; 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
}
26 changes: 26 additions & 0 deletions llvm/test/Transforms/LoadStoreVectorizer/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
; RUN: opt -S < %s -load-store-vectorizer | FileCheck %s

declare void @llvm.sideeffect()

; load-store vectorization across a @llvm.sideeffect.

; CHECK-LABEL: test
; CHECK: load <4 x float>
; CHECK: store <4 x float>
define void @test(float* %p) {
%p0 = getelementptr float, float* %p, i64 0
%p1 = getelementptr float, float* %p, i64 1
%p2 = getelementptr float, float* %p, i64 2
%p3 = getelementptr float, float* %p, i64 3
%l0 = load float, float* %p0, align 16
%l1 = load float, float* %p1
%l2 = load float, float* %p2
call void @llvm.sideeffect()
%l3 = load float, float* %p3
store float %l0, float* %p0, align 16
call void @llvm.sideeffect()
store float %l1, float* %p1
store float %l2, float* %p2
store float %l3, float* %p3
ret void
}
23 changes: 23 additions & 0 deletions llvm/test/Transforms/LoopIdiom/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
; RUN: opt -S < %s -loop-idiom | FileCheck %s

declare void @llvm.sideeffect()

; Loop idiom recognition across a @llvm.sideeffect.

; CHECK-LABEL: zero
; CHECK: llvm.memset
define void @zero(float* %p, i64 %n) nounwind {
bb7.lr.ph:
br label %bb7

bb7:
%i.02 = phi i64 [ 0, %bb7.lr.ph ], [ %tmp13, %bb7 ]
%tmp10 = getelementptr inbounds float, float* %p, i64 %i.02
store float 0.000000e+00, float* %tmp10, align 4
%tmp13 = add i64 %i.02, 1
%tmp6 = icmp ult i64 %tmp13, %n
br i1 %tmp6, label %bb7, label %bb14

bb14:
ret void
}
24 changes: 24 additions & 0 deletions llvm/test/Transforms/LoopVectorize/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
; RUN: opt -S < %s -loop-vectorize -force-vector-width=4 | FileCheck %s

declare void @llvm.sideeffect()

; Vectorization across a @llvm.sideeffect.

; CHECK-LABEL: store_ones
; CHECK: store <4 x float>
define void @store_ones(float* %p, i64 %n) nounwind {
bb7.lr.ph:
br label %bb7

bb7:
%i.02 = phi i64 [ 0, %bb7.lr.ph ], [ %tmp13, %bb7 ]
call void @llvm.sideeffect()
%tmp10 = getelementptr inbounds float, float* %p, i64 %i.02
store float 1.0, float* %tmp10, align 4
%tmp13 = add i64 %i.02, 1
%tmp6 = icmp ult i64 %tmp13, %n
br i1 %tmp6, label %bb7, label %bb14

bb14:
ret void
}
27 changes: 27 additions & 0 deletions llvm/test/Transforms/NewGVN/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
; RUN: opt -S < %s -newgvn | 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
}
25 changes: 25 additions & 0 deletions llvm/test/Transforms/SLPVectorizer/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
; RUN: opt -S < %s -slp-vectorizer -slp-max-reg-size=128 -slp-min-reg-size=128 | FileCheck %s

declare void @llvm.sideeffect()

; SLP vectorization across a @llvm.sideeffect.

; CHECK-LABEL: test
; CHECK: store <4 x float>
define void @test(float* %p) {
%p0 = getelementptr float, float* %p, i64 0
%p1 = getelementptr float, float* %p, i64 1
%p2 = getelementptr float, float* %p, i64 2
%p3 = getelementptr float, float* %p, i64 3
%l0 = load float, float* %p0
%l1 = load float, float* %p1
%l2 = load float, float* %p2
call void @llvm.sideeffect()
%l3 = load float, float* %p3
store float %l0, float* %p0
call void @llvm.sideeffect()
store float %l1, float* %p1
store float %l2, float* %p2
store float %l3, float* %p3
ret void
}