1 ; RUN: opt < %s -S -early-cse | FileCheck %s
3 ; CHECK-LABEL: @test12(
4 define i32 @test12(i1 %B, i32* %P1, i32* %P2) {
5 %load0 = load i32, i32* %P1
6 %1 = load atomic i32, i32* %P2 seq_cst, align 4
7 %load1 = load i32, i32* %P1
8 %sel = select i1 %B, i32 %load0, i32 %load1
10 ; CHECK: load i32, i32* %P1
11 ; CHECK: load i32, i32* %P1
14 ; CHECK-LABEL: @test13(
15 ; atomic to non-atomic forwarding is legal
16 define i32 @test13(i1 %B, i32* %P1) {
17 %a = load atomic i32, i32* %P1 seq_cst, align 4
18 %b = load i32, i32* %P1
21 ; CHECK: load atomic i32, i32* %P1
25 ; CHECK-LABEL: @test14(
26 ; atomic to unordered atomic forwarding is legal
27 define i32 @test14(i1 %B, i32* %P1) {
28 %a = load atomic i32, i32* %P1 seq_cst, align 4
29 %b = load atomic i32, i32* %P1 unordered, align 4
32 ; CHECK: load atomic i32, i32* %P1
36 ; CHECK-LABEL: @test15(
37 ; implementation restiction: can't forward to stonger
39 define i32 @test15(i1 %B, i32* %P1, i32* %P2) {
40 %a = load atomic i32, i32* %P1 seq_cst, align 4
41 %b = load atomic i32, i32* %P1 seq_cst, align 4
44 ; CHECK: load atomic i32, i32* %P1
45 ; CHECK: load atomic i32, i32* %P1
48 ; CHECK-LABEL: @test16(
49 ; forwarding non-atomic to atomic is wrong! (However,
50 ; it would be legal to use the later value in place of the
51 ; former in this particular example. We just don't
53 define i32 @test16(i1 %B, i32* %P1, i32* %P2) {
54 %a = load i32, i32* %P1, align 4
55 %b = load atomic i32, i32* %P1 unordered, align 4
58 ; CHECK: load i32, i32* %P1
59 ; CHECK: load atomic i32, i32* %P1
62 ; Can't DSE across a full fence
63 define void @test17(i1 %B, i32* %P1, i32* %P2) {
64 ; CHECK-LABEL: @test17
68 store i32 0, i32* %P1, align 4
69 store atomic i32 0, i32* %P2 seq_cst, align 4
70 store i32 0, i32* %P1, align 4
74 ; Can't remove a volatile load
75 define i32 @test18(i1 %B, i32* %P1, i32* %P2) {
76 %a = load i32, i32* %P1, align 4
77 %b = load volatile i32, i32* %P1, align 4
80 ; CHECK-LABEL: @test18
81 ; CHECK: load i32, i32* %P1
82 ; CHECK: load volatile i32, i32* %P1
85 ; Can't DSE a volatile store
86 define void @test19(i1 %B, i32* %P1, i32* %P2) {
87 ; CHECK-LABEL: @test19
88 ; CHECK: store volatile
90 store volatile i32 0, i32* %P1, align 4
91 store i32 3, i32* %P1, align 4
95 ; Can value forward from volailes
96 define i32 @test20(i1 %B, i32* %P1, i32* %P2) {
97 %a = load volatile i32, i32* %P1, align 4
98 %b = load i32, i32* %P1, align 4
101 ; CHECK-LABEL: @test20
102 ; CHECK: load volatile i32, i32* %P1
106 ; Can DSE a non-volatile store in favor of a volatile one
107 ; currently a missed optimization
108 define void @test21(i1 %B, i32* %P1, i32* %P2) {
109 ; CHECK-LABEL: @test21
111 ; CHECK: store volatile
112 store i32 0, i32* %P1, align 4
113 store volatile i32 3, i32* %P1, align 4
117 ; Can DSE a normal store in favor of a unordered one
118 define void @test22(i1 %B, i32* %P1, i32* %P2) {
119 ; CHECK-LABEL: @test22
120 ; CHECK-NEXT: store atomic
121 store i32 0, i32* %P1, align 4
122 store atomic i32 3, i32* %P1 unordered, align 4