xref: /llvm-project/llvm/test/Transforms/NewGVN/addrspacecast.ll (revision 229640343e400394b315c6798c7c19e8a9bd188c)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=newgvn < %s | FileCheck %s
3
4define ptr addrspace(1) @addrspacecast(ptr %ptr) {
5; CHECK-LABEL: @addrspacecast(
6; CHECK-NEXT:  block1:
7; CHECK-NEXT:    [[Z1:%.*]] = addrspacecast ptr [[PTR:%.*]] to ptr addrspace(1)
8; CHECK-NEXT:    br label [[BLOCK2:%.*]]
9; CHECK:       block2:
10; CHECK-NEXT:    store ptr addrspace(1) [[Z1]], ptr undef, align 8
11; CHECK-NEXT:    ret ptr addrspace(1) [[Z1]]
12;
13block1:
14  %z1 = addrspacecast ptr %ptr to ptr addrspace(1)
15  br label %block2
16
17block2:
18  %z2 = addrspacecast ptr %ptr to ptr addrspace(1)
19  store ptr addrspace(1) %z1, ptr undef
20  ret ptr addrspace(1) %z2
21}
22
23; Make sure casts with the same source value but different result
24; address spaces aren't incorrectly merged.
25define ptr addrspace(1) @addrspacecast_different_result_types(ptr %ptr) {
26; CHECK-LABEL: @addrspacecast_different_result_types(
27; CHECK-NEXT:  block1:
28; CHECK-NEXT:    [[Z1:%.*]] = addrspacecast ptr [[PTR:%.*]] to ptr addrspace(2)
29; CHECK-NEXT:    br label [[BLOCK2:%.*]]
30; CHECK:       block2:
31; CHECK-NEXT:    [[Z2:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(1)
32; CHECK-NEXT:    store ptr addrspace(2) [[Z1]], ptr undef, align 8
33; CHECK-NEXT:    ret ptr addrspace(1) [[Z2]]
34;
35block1:
36  %z1 = addrspacecast ptr %ptr to ptr addrspace(2)
37  br label %block2
38
39block2:
40  %z2 = addrspacecast ptr %ptr to ptr addrspace(1)
41  store ptr addrspace(2) %z1, ptr undef
42  ret ptr addrspace(1) %z2
43}
44
45define ptr addrspace(1) @addrspacecast_simplify(ptr addrspace(1) %ptr) {
46; CHECK-LABEL: @addrspacecast_simplify(
47; CHECK-NEXT:  block1:
48; CHECK-NEXT:    [[CAST0:%.*]] = addrspacecast ptr addrspace(1) [[PTR:%.*]] to ptr
49; CHECK-NEXT:    br label [[BLOCK2:%.*]]
50; CHECK:       block2:
51; CHECK-NEXT:    store ptr addrspace(1) [[PTR]], ptr undef, align 8
52; CHECK-NEXT:    ret ptr addrspace(1) [[PTR]]
53;
54block1:
55  %cast0 = addrspacecast ptr addrspace(1) %ptr to ptr
56  %z1 = addrspacecast ptr %cast0 to ptr addrspace(1)
57  br label %block2
58
59block2:
60  %z2 = addrspacecast ptr %cast0 to ptr addrspace(1)
61  store ptr addrspace(1) %z1, ptr undef
62  ret ptr addrspace(1) %z2
63}
64
65@h = common local_unnamed_addr global ptr null, align 4
66
67define ptr addrspace(1) @addrspacecast_constant() {
68; CHECK-LABEL: @addrspacecast_constant(
69; CHECK-NEXT:  block1:
70; CHECK-NEXT:    store ptr undef, ptr @h, align 4
71; CHECK-NEXT:    br label [[BLOCK2:%.*]]
72; CHECK:       block2:
73; CHECK-NEXT:    store ptr addrspace(1) undef, ptr undef, align 8
74; CHECK-NEXT:    ret ptr addrspace(1) undef
75;
76block1:
77  store ptr undef, ptr @h, align 4
78  %ptr = load ptr, ptr @h, align 4
79  %z1 = addrspacecast ptr %ptr to ptr addrspace(1)
80  br label %block2
81
82block2:
83  %z2 = addrspacecast ptr %ptr to ptr addrspace(1)
84  store ptr addrspace(1) %z1, ptr undef
85  ret ptr addrspace(1) %z2
86}
87
88define ptr addrspace(1) @addrspacecast_leader(ptr %arg.ptr) {
89; CHECK-LABEL: @addrspacecast_leader(
90; CHECK-NEXT:  block1:
91; CHECK-NEXT:    [[LOAD0:%.*]] = load ptr, ptr [[ARG_PTR:%.*]], align 8
92; CHECK-NEXT:    [[Z1:%.*]] = addrspacecast ptr [[LOAD0]] to ptr addrspace(1)
93; CHECK-NEXT:    br label [[BLOCK2:%.*]]
94; CHECK:       block2:
95; CHECK-NEXT:    store ptr addrspace(1) [[Z1]], ptr undef, align 8
96; CHECK-NEXT:    ret ptr addrspace(1) [[Z1]]
97;
98block1:
99  %load0 = load ptr, ptr %arg.ptr
100  %z1 = addrspacecast ptr %load0 to ptr addrspace(1)
101  br label %block2
102
103block2:
104  %load1 = load ptr, ptr %arg.ptr
105  %z2 = addrspacecast ptr %load1 to ptr addrspace(1)
106  store ptr addrspace(1) %z1, ptr undef
107  ret ptr addrspace(1) %z2
108}
109