xref: /llvm-project/llvm/test/Bitcode/constexpr-to-instr.ll (revision d452d5e2de70a180e5af26dbda40cfb8b2506590)
10c40651fSNikita Popov; RUN: llvm-dis -expand-constant-exprs < %s.bc | FileCheck %s
2941c8e0eSNikita Popov
3941c8e0eSNikita Popov@g = extern_weak global i32
4941c8e0eSNikita Popov@g2 = extern_weak global i32
5941c8e0eSNikita Popov
6941c8e0eSNikita Popovdefine i64 @test_cast() {
7941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_cast() {
8941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
9941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr
10941c8e0eSNikita Popov  ret i64 ptrtoint (ptr @g to i64)
11941c8e0eSNikita Popov}
12941c8e0eSNikita Popov
13941c8e0eSNikita Popovdefine i1 @test_icmp() {
14941c8e0eSNikita Popov; CHECK-LABEL: define i1 @test_icmp() {
15941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
16941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = icmp ne i64 %constexpr, 0
17941c8e0eSNikita Popov; CHECK-NEXT: ret i1 %constexpr1
18941c8e0eSNikita Popov  ret i1 icmp ne (i64 ptrtoint (ptr @g to i64), i64 0)
19941c8e0eSNikita Popov}
20941c8e0eSNikita Popov
21941c8e0eSNikita Popovdefine i32 @test_select() {
22941c8e0eSNikita Popov; CHECK-LABEL: define i32 @test_select() {
23941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
24941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = icmp ne i64 %constexpr, 0
25941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = select i1 %constexpr1, i32 1, i32 2
26941c8e0eSNikita Popov; CHECK-NEXT: ret i32 %constexpr2
27941c8e0eSNikita Popov  ret i32 select (i1 icmp ne (i64 ptrtoint (ptr @g to i64), i64 0), i32 1, i32 2)
28941c8e0eSNikita Popov}
29941c8e0eSNikita Popov
30941c8e0eSNikita Popovdefine i8 @test_extractelement() {
31941c8e0eSNikita Popov; CHECK-LABEL: define i8 @test_extractelement() {
32941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
33941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = icmp ne i64 %constexpr, 0
34941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = select i1 %constexpr1, <2 x i8> zeroinitializer, <2 x i8> <i8 0, i8 1>
35941c8e0eSNikita Popov; CHECK-NEXT: %constexpr3 = extractelement <2 x i8> %constexpr2, i32 0
36941c8e0eSNikita Popov; CHECK-NEXT: ret i8 %constexpr3
37941c8e0eSNikita Popov  ret i8 extractelement (<2 x i8> select (i1 icmp ne (i64 ptrtoint (ptr @g to i64), i64 0), <2 x i8> zeroinitializer, <2 x i8> <i8 0, i8 1>), i32 0)
38941c8e0eSNikita Popov}
39941c8e0eSNikita Popov
40941c8e0eSNikita Popovdefine <2 x i8> @test_insertelement() {
41941c8e0eSNikita Popov; CHECK-LABEL: define <2 x i8> @test_insertelement() {
42941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i32
43941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = insertelement <2 x i8> poison, i8 42, i32 %constexpr
44941c8e0eSNikita Popov; CHECK-NEXT: ret <2 x i8> %constexpr1
45941c8e0eSNikita Popov  ret <2 x i8> insertelement (<2 x i8> poison, i8 42, i32 ptrtoint (ptr @g to i32))
46941c8e0eSNikita Popov}
47941c8e0eSNikita Popov
48941c8e0eSNikita Popovdefine double @test_fneg() {
49941c8e0eSNikita Popov; CHECK-LABEL: define double @test_fneg() {
50941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
51941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = bitcast i64 %constexpr to double
52941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = fneg double %constexpr1
53941c8e0eSNikita Popov  ret double fneg (double bitcast (i64 ptrtoint (ptr @g to i64) to double))
54941c8e0eSNikita Popov}
55941c8e0eSNikita Popov
56941c8e0eSNikita Popovdefine i64 @test_flags() {
57941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_flags() {
58941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
59941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = add nuw i64 %constexpr, 1
60941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr1
61941c8e0eSNikita Popov  ret i64 add nuw (i64 ptrtoint (ptr @g to i64), i64 1)
62941c8e0eSNikita Popov}
63941c8e0eSNikita Popov
64941c8e0eSNikita Popovdefine <3 x i64> @test_vector() {
65941c8e0eSNikita Popov; CHECK-LABEL: define <3 x i64> @test_vector() {
66941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
67941c8e0eSNikita Popov; CHECK-NEXT: %constexpr.ins = insertelement <3 x i64> poison, i64 5, i32 0
68941c8e0eSNikita Popov; CHECK-NEXT: %constexpr.ins1 = insertelement <3 x i64> %constexpr.ins, i64 %constexpr, i32 1
69941c8e0eSNikita Popov; CHECK-NEXT: %constexpr.ins2 = insertelement <3 x i64> %constexpr.ins1, i64 7, i32 2
70941c8e0eSNikita Popov  ret <3 x i64> <i64 5, i64 ptrtoint (ptr @g to i64), i64 7>
71941c8e0eSNikita Popov}
72941c8e0eSNikita Popov
73*d452d5e2SNikita Popovdefine [3 x i64] @test_array() {
74*d452d5e2SNikita Popov; CHECK-LABEL: define [3 x i64] @test_array() {
75*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
76*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins = insertvalue [3 x i64] poison, i64 5, 0
77*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins1 = insertvalue [3 x i64] %constexpr.ins, i64 %constexpr, 1
78*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins2 = insertvalue [3 x i64] %constexpr.ins1, i64 7, 2
79*d452d5e2SNikita Popov  ret [3 x i64] [i64 5, i64 ptrtoint (ptr @g to i64), i64 7]
80*d452d5e2SNikita Popov}
81*d452d5e2SNikita Popov
82*d452d5e2SNikita Popovdefine { i64, i64, i64 } @test_struct() {
83*d452d5e2SNikita Popov; CHECK-LABEL: define { i64, i64, i64 } @test_struct() {
84*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
85*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins = insertvalue { i64, i64, i64 } poison, i64 5, 0
86*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins1 = insertvalue { i64, i64, i64 } %constexpr.ins, i64 %constexpr, 1
87*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins2 = insertvalue { i64, i64, i64 } %constexpr.ins1, i64 7, 2
88*d452d5e2SNikita Popov  ret { i64, i64, i64 } {i64 5, i64 ptrtoint (ptr @g to i64), i64 7}
89*d452d5e2SNikita Popov}
90*d452d5e2SNikita Popov
91941c8e0eSNikita Popovdefine i64 @test_reused_expr() {
92941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_reused_expr() {
93941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
94941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = add i64 %constexpr, %constexpr
95941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr1
96941c8e0eSNikita Popov  ret i64 add (i64 ptrtoint (ptr @g to i64), i64 ptrtoint (ptr @g to i64))
97941c8e0eSNikita Popov}
98941c8e0eSNikita Popov
99941c8e0eSNikita Popovdefine i64 @test_multiple_expanded_operands() {
100941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_multiple_expanded_operands() {
101941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
102941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = ptrtoint ptr @g2 to i64
103941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = add i64 %constexpr, %constexpr1
104941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr2
105941c8e0eSNikita Popov  ret i64 add (i64 ptrtoint (ptr @g to i64), i64 ptrtoint (ptr @g2 to i64))
106941c8e0eSNikita Popov}
107941c8e0eSNikita Popov
108941c8e0eSNikita Popovdefine i64 @test_mid_block(i64 %arg) {
109941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_mid_block(i64 %arg) {
110941c8e0eSNikita Popov; CHECK-NEXT: %x = mul i64 %arg, 3
111941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
112941c8e0eSNikita Popov; CHECK-NEXT: %add = add i64 %x, %constexpr
113941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %add
114941c8e0eSNikita Popov  %x = mul i64 %arg, 3
115941c8e0eSNikita Popov  %add = add i64 %x, ptrtoint (ptr @g to i64)
116941c8e0eSNikita Popov  ret i64 %add
117941c8e0eSNikita Popov}
118941c8e0eSNikita Popov
119941c8e0eSNikita Popovdefine i64 @test_phi_non_critical_edge_block_before(i1 %c) {
120941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_non_critical_edge_block_before(i1 %c) {
121941c8e0eSNikita Popov; CHECK: entry:
122941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %join
123941c8e0eSNikita Popov; CHECK: if:
124941c8e0eSNikita Popov; CHECK-NEXT: br label %phi.constexpr
125941c8e0eSNikita Popov; CHECK: phi.constexpr:
126941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
127941c8e0eSNikita Popov; CHECK-NEXT: br label %join
128941c8e0eSNikita Popov; CHECK: join:
129941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ 0, %entry ], [ %constexpr, %phi.constexpr ]
130941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi
131941c8e0eSNikita Popoventry:
132941c8e0eSNikita Popov  br i1 %c, label %if, label %join
133941c8e0eSNikita Popov
134941c8e0eSNikita Popovif:
135941c8e0eSNikita Popov  br label %join
136941c8e0eSNikita Popov
137941c8e0eSNikita Popovjoin:
138941c8e0eSNikita Popov  %phi = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g to i64), %if ]
139941c8e0eSNikita Popov  ret i64 %phi
140941c8e0eSNikita Popov}
141941c8e0eSNikita Popov
142941c8e0eSNikita Popovdefine i64 @test_phi_non_critical_edge_block_after(i1 %c) {
143941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_non_critical_edge_block_after(i1 %c) {
144941c8e0eSNikita Popov; CHECK: entry:
145941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %join
146941c8e0eSNikita Popov; CHECK: phi.constexpr:
147941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
148941c8e0eSNikita Popov; CHECK-NEXT: br label %join
149941c8e0eSNikita Popov; CHECK: join:
150941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ 0, %entry ], [ %constexpr, %phi.constexpr ]
151941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi
152941c8e0eSNikita Popov; CHECK: if:
153941c8e0eSNikita Popov; CHECK-NEXT: br label %phi.constexpr
154941c8e0eSNikita Popoventry:
155941c8e0eSNikita Popov  br i1 %c, label %if, label %join
156941c8e0eSNikita Popov
157941c8e0eSNikita Popovjoin:
158941c8e0eSNikita Popov  %phi = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g to i64), %if ]
159941c8e0eSNikita Popov  ret i64 %phi
160941c8e0eSNikita Popov
161941c8e0eSNikita Popovif:
162941c8e0eSNikita Popov  br label %join
163941c8e0eSNikita Popov}
164941c8e0eSNikita Popov
165941c8e0eSNikita Popovdefine i64 @test_phi_critical_edge(i1 %c) {
166941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_critical_edge(i1 %c) {
167941c8e0eSNikita Popov; CHECK: entry:
168941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %phi.constexpr
169941c8e0eSNikita Popov; CHECK: if:
170941c8e0eSNikita Popov; CHECK-NEXT: br label %join
171941c8e0eSNikita Popov; CHECK: phi.constexpr:
172941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
173941c8e0eSNikita Popov; CHECK-NEXT: br label %join
174941c8e0eSNikita Popov; CHECK: join:
175941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ %constexpr, %phi.constexpr ], [ 0, %if ]
176941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi
177941c8e0eSNikita Popoventry:
178941c8e0eSNikita Popov  br i1 %c, label %if, label %join
179941c8e0eSNikita Popov
180941c8e0eSNikita Popovif:
181941c8e0eSNikita Popov  br label %join
182941c8e0eSNikita Popov
183941c8e0eSNikita Popovjoin:
184941c8e0eSNikita Popov  %phi = phi i64 [ ptrtoint (ptr @g to i64), %entry ], [ 0, %if ]
185941c8e0eSNikita Popov  ret i64 %phi
186941c8e0eSNikita Popov}
187941c8e0eSNikita Popov
188941c8e0eSNikita Popovdefine i64 @test_phi_multiple_nodes(i1 %c) {
189941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_multiple_nodes(i1 %c) {
190941c8e0eSNikita Popov; CHECK: entry:
191941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %join
192941c8e0eSNikita Popov; CHECK: if:
193941c8e0eSNikita Popov; CHECK-NEXT: br label %phi.constexpr
194941c8e0eSNikita Popov; CHECK: phi.constexpr:
195941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
196941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = ptrtoint ptr @g2 to i64
197941c8e0eSNikita Popov; CHECK-NEXT: br label %join
198941c8e0eSNikita Popov; CHECK: join:
199941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ 0, %entry ], [ %constexpr, %phi.constexpr ]
200941c8e0eSNikita Popov; CHECK-NEXT: %phi2 = phi i64 [ 0, %entry ], [ %constexpr2, %phi.constexpr ]
201941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi
202941c8e0eSNikita Popoventry:
203941c8e0eSNikita Popov  br i1 %c, label %if, label %join
204941c8e0eSNikita Popov
205941c8e0eSNikita Popovif:
206941c8e0eSNikita Popov  br label %join
207941c8e0eSNikita Popov
208941c8e0eSNikita Popovjoin:
209941c8e0eSNikita Popov  %phi = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g to i64), %if ]
210941c8e0eSNikita Popov  %phi2 = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g2 to i64), %if ]
211941c8e0eSNikita Popov  ret i64 %phi
212941c8e0eSNikita Popov}
213941c8e0eSNikita Popov
214941c8e0eSNikita Popov
215941c8e0eSNikita Popovdefine i64 @test_phi_multiple_identical_predecessors(i32 %x) {
216941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_multiple_identical_predecessors(i32 %x) {
217941c8e0eSNikita Popov; CHECK: entry:
218941c8e0eSNikita Popov; CHECK-NEXT: switch i32 %x, label %default [
219941c8e0eSNikita Popov; CHECK-NEXT:   i32 0, label %phi.constexpr
220941c8e0eSNikita Popov; CHECK-NEXT:   i32 1, label %phi.constexpr
221941c8e0eSNikita Popov; CHECK-NEXT: ]
222941c8e0eSNikita Popov; CHECK: default:
223941c8e0eSNikita Popov; CHECK-NEXT: br label %join
224941c8e0eSNikita Popov; CHECK: phi.constexpr:
225941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64
226941c8e0eSNikita Popov; CHECK-NEXT: br label %join
227941c8e0eSNikita Popov; CHECK: join:
228941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ %constexpr, %phi.constexpr ], [ %constexpr, %phi.constexpr ], [ 0, %default ]
229941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi
230941c8e0eSNikita Popoventry:
231941c8e0eSNikita Popov  switch i32 %x, label %default [
232941c8e0eSNikita Popov    i32 0, label %join
233941c8e0eSNikita Popov    i32 1, label %join
234941c8e0eSNikita Popov  ]
235941c8e0eSNikita Popov
236941c8e0eSNikita Popovdefault:
237941c8e0eSNikita Popov  br label %join
238941c8e0eSNikita Popov
239941c8e0eSNikita Popovjoin:
240941c8e0eSNikita Popov  %phi = phi i64 [ ptrtoint (ptr @g to i64), %entry ], [ ptrtoint (ptr @g to i64), %entry ], [ 0, %default ]
241941c8e0eSNikita Popov  ret i64 %phi
242941c8e0eSNikita Popov}
243