| 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 | ||
| } |
| 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 | ||
| } |
| 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 | ||
| } |
| 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 | ||
| } |
| 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 | ||
| } |
| 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 | ||
| } |
| 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 | ||
| } |
| 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 | ||
| } |