xref: /llvm-project/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -verify-machineinstrs -no-integrated-as < %s \
3; RUN:   | FileCheck -check-prefixes=RV32I,RV32I-NO-INTEGRATED %s
4; RUN: llc -mtriple=riscv64 -verify-machineinstrs -no-integrated-as < %s \
5; RUN:   | FileCheck -check-prefixes=RV64I,RV64I-NO-INTEGRATED %s
6; RUN: llc -mtriple=riscv32 -code-model=medium -verify-machineinstrs -no-integrated-as < %s \
7; RUN:   | FileCheck -check-prefixes=RV32I-MEDIUM,RV32I-MEDIUM-NO-INTEGRATED %s
8; RUN: llc -mtriple=riscv64 -code-model=medium -verify-machineinstrs -no-integrated-as < %s \
9; RUN:   | FileCheck -check-prefixes=RV64I-MEDIUM,RV64I-MEDIUM-NO-INTEGRATED %s
10; RUN: llc -mtriple=riscv64 -code-model=large -verify-machineinstrs -no-integrated-as < %s \
11; RUN:   | FileCheck -check-prefixes=RV64I-LARGE,RV64I-LARGE-NO-INTEGRATED %s
12; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
13; RUN:   | FileCheck -check-prefixes=RV32I,RV32I-INTEGRATED %s
14; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
15; RUN:   | FileCheck -check-prefixes=RV64I,RV64I-INTEGRATED %s
16; RUN: llc -mtriple=riscv32 -code-model=medium -verify-machineinstrs < %s \
17; RUN:   | FileCheck -check-prefixes=RV32I-MEDIUM,RV32I-MEDIUM-INTEGRATED %s
18; RUN: llc -mtriple=riscv64 -code-model=medium -verify-machineinstrs < %s \
19; RUN:   | FileCheck -check-prefixes=RV64I-MEDIUM,RV64I-MEDIUM-INTEGRATED %s
20; RUN: llc -mtriple=riscv64 -code-model=large -verify-machineinstrs < %s \
21; RUN:   | FileCheck -check-prefixes=RV64I-LARGE,RV64I-LARGE-INTEGRATED %s
22
23@eg = external global [4000 x i32], align 4
24@ewg = extern_weak global [4000 x i32], align 4
25
26define void @constraint_m_1(ptr %a) nounwind {
27; RV32I-LABEL: constraint_m_1:
28; RV32I:       # %bb.0:
29; RV32I-NEXT:    #APP
30; RV32I-NEXT:    #NO_APP
31; RV32I-NEXT:    ret
32;
33; RV64I-LABEL: constraint_m_1:
34; RV64I:       # %bb.0:
35; RV64I-NEXT:    #APP
36; RV64I-NEXT:    #NO_APP
37; RV64I-NEXT:    ret
38;
39; RV32I-MEDIUM-LABEL: constraint_m_1:
40; RV32I-MEDIUM:       # %bb.0:
41; RV32I-MEDIUM-NEXT:    #APP
42; RV32I-MEDIUM-NEXT:    #NO_APP
43; RV32I-MEDIUM-NEXT:    ret
44;
45; RV64I-MEDIUM-LABEL: constraint_m_1:
46; RV64I-MEDIUM:       # %bb.0:
47; RV64I-MEDIUM-NEXT:    #APP
48; RV64I-MEDIUM-NEXT:    #NO_APP
49; RV64I-MEDIUM-NEXT:    ret
50;
51; RV64I-LARGE-LABEL: constraint_m_1:
52; RV64I-LARGE:       # %bb.0:
53; RV64I-LARGE-NEXT:    #APP
54; RV64I-LARGE-NEXT:    #NO_APP
55; RV64I-LARGE-NEXT:    ret
56  call void asm sideeffect "", "=*m"(ptr elementtype(i32) %a)
57  ret void
58}
59
60define i32 @constraint_m_2(ptr %a) nounwind {
61; RV32I-LABEL: constraint_m_2:
62; RV32I:       # %bb.0:
63; RV32I-NEXT:    #APP
64; RV32I-NEXT:    lw a0, 0(a0)
65; RV32I-NEXT:    #NO_APP
66; RV32I-NEXT:    ret
67;
68; RV64I-LABEL: constraint_m_2:
69; RV64I:       # %bb.0:
70; RV64I-NEXT:    #APP
71; RV64I-NEXT:    lw a0, 0(a0)
72; RV64I-NEXT:    #NO_APP
73; RV64I-NEXT:    ret
74;
75; RV32I-MEDIUM-LABEL: constraint_m_2:
76; RV32I-MEDIUM:       # %bb.0:
77; RV32I-MEDIUM-NEXT:    #APP
78; RV32I-MEDIUM-NEXT:    lw a0, 0(a0)
79; RV32I-MEDIUM-NEXT:    #NO_APP
80; RV32I-MEDIUM-NEXT:    ret
81;
82; RV64I-MEDIUM-LABEL: constraint_m_2:
83; RV64I-MEDIUM:       # %bb.0:
84; RV64I-MEDIUM-NEXT:    #APP
85; RV64I-MEDIUM-NEXT:    lw a0, 0(a0)
86; RV64I-MEDIUM-NEXT:    #NO_APP
87; RV64I-MEDIUM-NEXT:    ret
88;
89; RV64I-LARGE-LABEL: constraint_m_2:
90; RV64I-LARGE:       # %bb.0:
91; RV64I-LARGE-NEXT:    #APP
92; RV64I-LARGE-NEXT:    lw a0, 0(a0)
93; RV64I-LARGE-NEXT:    #NO_APP
94; RV64I-LARGE-NEXT:    ret
95  %1 = tail call i32 asm "lw $0, $1", "=r,*m"(ptr elementtype(i32) %a)
96  ret i32 %1
97}
98
99define i32 @constraint_m_with_offset(ptr %a) nounwind {
100; RV32I-LABEL: constraint_m_with_offset:
101; RV32I:       # %bb.0:
102; RV32I-NEXT:    #APP
103; RV32I-NEXT:    lw a0, 4(a0)
104; RV32I-NEXT:    #NO_APP
105; RV32I-NEXT:    ret
106;
107; RV64I-LABEL: constraint_m_with_offset:
108; RV64I:       # %bb.0:
109; RV64I-NEXT:    #APP
110; RV64I-NEXT:    lw a0, 4(a0)
111; RV64I-NEXT:    #NO_APP
112; RV64I-NEXT:    ret
113;
114; RV32I-MEDIUM-LABEL: constraint_m_with_offset:
115; RV32I-MEDIUM:       # %bb.0:
116; RV32I-MEDIUM-NEXT:    #APP
117; RV32I-MEDIUM-NEXT:    lw a0, 4(a0)
118; RV32I-MEDIUM-NEXT:    #NO_APP
119; RV32I-MEDIUM-NEXT:    ret
120;
121; RV64I-MEDIUM-LABEL: constraint_m_with_offset:
122; RV64I-MEDIUM:       # %bb.0:
123; RV64I-MEDIUM-NEXT:    #APP
124; RV64I-MEDIUM-NEXT:    lw a0, 4(a0)
125; RV64I-MEDIUM-NEXT:    #NO_APP
126; RV64I-MEDIUM-NEXT:    ret
127;
128; RV64I-LARGE-LABEL: constraint_m_with_offset:
129; RV64I-LARGE:       # %bb.0:
130; RV64I-LARGE-NEXT:    #APP
131; RV64I-LARGE-NEXT:    lw a0, 4(a0)
132; RV64I-LARGE-NEXT:    #NO_APP
133; RV64I-LARGE-NEXT:    ret
134  %1 = getelementptr i32, ptr %a, i32 1
135  %2 = tail call i32 asm "lw $0, $1", "=r,*m"(ptr elementtype(i32) %1)
136  ret i32 %2
137}
138
139define void @constraint_m_with_global_1() nounwind {
140; RV32I-LABEL: constraint_m_with_global_1:
141; RV32I:       # %bb.0:
142; RV32I-NEXT:    lui a0, %hi(eg)
143; RV32I-NEXT:    #APP
144; RV32I-NEXT:    sw zero, %lo(eg)(a0)
145; RV32I-NEXT:    #NO_APP
146; RV32I-NEXT:    ret
147;
148; RV64I-LABEL: constraint_m_with_global_1:
149; RV64I:       # %bb.0:
150; RV64I-NEXT:    lui a0, %hi(eg)
151; RV64I-NEXT:    #APP
152; RV64I-NEXT:    sw zero, %lo(eg)(a0)
153; RV64I-NEXT:    #NO_APP
154; RV64I-NEXT:    ret
155;
156; RV32I-MEDIUM-LABEL: constraint_m_with_global_1:
157; RV32I-MEDIUM:       # %bb.0:
158; RV32I-MEDIUM-NEXT:  .Lpcrel_hi0:
159; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
160; RV32I-MEDIUM-NEXT:    #APP
161; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
162; RV32I-MEDIUM-NEXT:    #NO_APP
163; RV32I-MEDIUM-NEXT:    ret
164;
165; RV64I-MEDIUM-LABEL: constraint_m_with_global_1:
166; RV64I-MEDIUM:       # %bb.0:
167; RV64I-MEDIUM-NEXT:  .Lpcrel_hi0:
168; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
169; RV64I-MEDIUM-NEXT:    #APP
170; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
171; RV64I-MEDIUM-NEXT:    #NO_APP
172; RV64I-MEDIUM-NEXT:    ret
173;
174; RV64I-LARGE-LABEL: constraint_m_with_global_1:
175; RV64I-LARGE:       # %bb.0:
176; RV64I-LARGE-NEXT:  .Lpcrel_hi0:
177; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI3_0)
178; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)
179; RV64I-LARGE-NEXT:    #APP
180; RV64I-LARGE-NEXT:    sw zero, 0(a0)
181; RV64I-LARGE-NEXT:    #NO_APP
182; RV64I-LARGE-NEXT:    ret
183  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
184  ret void
185}
186
187define void @constraint_m_with_global_2() nounwind {
188; RV32I-LABEL: constraint_m_with_global_2:
189; RV32I:       # %bb.0:
190; RV32I-NEXT:    lui a0, %hi(eg+4)
191; RV32I-NEXT:    #APP
192; RV32I-NEXT:    sw zero, %lo(eg+4)(a0)
193; RV32I-NEXT:    #NO_APP
194; RV32I-NEXT:    ret
195;
196; RV64I-LABEL: constraint_m_with_global_2:
197; RV64I:       # %bb.0:
198; RV64I-NEXT:    lui a0, %hi(eg+4)
199; RV64I-NEXT:    #APP
200; RV64I-NEXT:    sw zero, %lo(eg+4)(a0)
201; RV64I-NEXT:    #NO_APP
202; RV64I-NEXT:    ret
203;
204; RV32I-MEDIUM-LABEL: constraint_m_with_global_2:
205; RV32I-MEDIUM:       # %bb.0:
206; RV32I-MEDIUM-NEXT:  .Lpcrel_hi1:
207; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
208; RV32I-MEDIUM-NEXT:    #APP
209; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
210; RV32I-MEDIUM-NEXT:    #NO_APP
211; RV32I-MEDIUM-NEXT:    ret
212;
213; RV64I-MEDIUM-LABEL: constraint_m_with_global_2:
214; RV64I-MEDIUM:       # %bb.0:
215; RV64I-MEDIUM-NEXT:  .Lpcrel_hi1:
216; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
217; RV64I-MEDIUM-NEXT:    #APP
218; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
219; RV64I-MEDIUM-NEXT:    #NO_APP
220; RV64I-MEDIUM-NEXT:    ret
221;
222; RV64I-LARGE-LABEL: constraint_m_with_global_2:
223; RV64I-LARGE:       # %bb.0:
224; RV64I-LARGE-NEXT:  .Lpcrel_hi1:
225; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI4_0)
226; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi1)(a0)
227; RV64I-LARGE-NEXT:    #APP
228; RV64I-LARGE-NEXT:    sw zero, 4(a0)
229; RV64I-LARGE-NEXT:    #NO_APP
230; RV64I-LARGE-NEXT:    ret
231  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 1))
232  ret void
233}
234
235define void @constraint_m_with_global_3() nounwind {
236; RV32I-LABEL: constraint_m_with_global_3:
237; RV32I:       # %bb.0:
238; RV32I-NEXT:    lui a0, %hi(eg+8000)
239; RV32I-NEXT:    #APP
240; RV32I-NEXT:    sw zero, %lo(eg+8000)(a0)
241; RV32I-NEXT:    #NO_APP
242; RV32I-NEXT:    ret
243;
244; RV64I-LABEL: constraint_m_with_global_3:
245; RV64I:       # %bb.0:
246; RV64I-NEXT:    lui a0, %hi(eg+8000)
247; RV64I-NEXT:    #APP
248; RV64I-NEXT:    sw zero, %lo(eg+8000)(a0)
249; RV64I-NEXT:    #NO_APP
250; RV64I-NEXT:    ret
251;
252; RV32I-MEDIUM-LABEL: constraint_m_with_global_3:
253; RV32I-MEDIUM:       # %bb.0:
254; RV32I-MEDIUM-NEXT:  .Lpcrel_hi2:
255; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
256; RV32I-MEDIUM-NEXT:    #APP
257; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
258; RV32I-MEDIUM-NEXT:    #NO_APP
259; RV32I-MEDIUM-NEXT:    ret
260;
261; RV64I-MEDIUM-LABEL: constraint_m_with_global_3:
262; RV64I-MEDIUM:       # %bb.0:
263; RV64I-MEDIUM-NEXT:  .Lpcrel_hi2:
264; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
265; RV64I-MEDIUM-NEXT:    #APP
266; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
267; RV64I-MEDIUM-NEXT:    #NO_APP
268; RV64I-MEDIUM-NEXT:    ret
269;
270; RV64I-LARGE-LABEL: constraint_m_with_global_3:
271; RV64I-LARGE:       # %bb.0:
272; RV64I-LARGE-NEXT:  .Lpcrel_hi2:
273; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI5_0)
274; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)
275; RV64I-LARGE-NEXT:    lui a1, 2
276; RV64I-LARGE-NEXT:    addiw a1, a1, -192
277; RV64I-LARGE-NEXT:    add a0, a0, a1
278; RV64I-LARGE-NEXT:    #APP
279; RV64I-LARGE-NEXT:    sw zero, 0(a0)
280; RV64I-LARGE-NEXT:    #NO_APP
281; RV64I-LARGE-NEXT:    ret
282  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 2000))
283  ret void
284}
285
286define void @constraint_m_with_extern_weak_global_1() nounwind {
287; RV32I-LABEL: constraint_m_with_extern_weak_global_1:
288; RV32I:       # %bb.0:
289; RV32I-NEXT:    lui a0, %hi(ewg)
290; RV32I-NEXT:    #APP
291; RV32I-NEXT:    sw zero, %lo(ewg)(a0)
292; RV32I-NEXT:    #NO_APP
293; RV32I-NEXT:    ret
294;
295; RV64I-LABEL: constraint_m_with_extern_weak_global_1:
296; RV64I:       # %bb.0:
297; RV64I-NEXT:    lui a0, %hi(ewg)
298; RV64I-NEXT:    #APP
299; RV64I-NEXT:    sw zero, %lo(ewg)(a0)
300; RV64I-NEXT:    #NO_APP
301; RV64I-NEXT:    ret
302;
303; RV32I-MEDIUM-LABEL: constraint_m_with_extern_weak_global_1:
304; RV32I-MEDIUM:       # %bb.0:
305; RV32I-MEDIUM-NEXT:  .Lpcrel_hi3:
306; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
307; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi3)(a0)
308; RV32I-MEDIUM-NEXT:    #APP
309; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
310; RV32I-MEDIUM-NEXT:    #NO_APP
311; RV32I-MEDIUM-NEXT:    ret
312;
313; RV64I-MEDIUM-LABEL: constraint_m_with_extern_weak_global_1:
314; RV64I-MEDIUM:       # %bb.0:
315; RV64I-MEDIUM-NEXT:  .Lpcrel_hi3:
316; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
317; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi3)(a0)
318; RV64I-MEDIUM-NEXT:    #APP
319; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
320; RV64I-MEDIUM-NEXT:    #NO_APP
321; RV64I-MEDIUM-NEXT:    ret
322;
323; RV64I-LARGE-LABEL: constraint_m_with_extern_weak_global_1:
324; RV64I-LARGE:       # %bb.0:
325; RV64I-LARGE-NEXT:  .Lpcrel_hi3:
326; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI6_0)
327; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi3)(a0)
328; RV64I-LARGE-NEXT:    #APP
329; RV64I-LARGE-NEXT:    sw zero, 0(a0)
330; RV64I-LARGE-NEXT:    #NO_APP
331; RV64I-LARGE-NEXT:    ret
332  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @ewg)
333  ret void
334}
335
336define void @constraint_m_with_extern_weak_global_2() nounwind {
337; RV32I-LABEL: constraint_m_with_extern_weak_global_2:
338; RV32I:       # %bb.0:
339; RV32I-NEXT:    lui a0, %hi(ewg+4)
340; RV32I-NEXT:    #APP
341; RV32I-NEXT:    sw zero, %lo(ewg+4)(a0)
342; RV32I-NEXT:    #NO_APP
343; RV32I-NEXT:    ret
344;
345; RV64I-LABEL: constraint_m_with_extern_weak_global_2:
346; RV64I:       # %bb.0:
347; RV64I-NEXT:    lui a0, %hi(ewg+4)
348; RV64I-NEXT:    #APP
349; RV64I-NEXT:    sw zero, %lo(ewg+4)(a0)
350; RV64I-NEXT:    #NO_APP
351; RV64I-NEXT:    ret
352;
353; RV32I-MEDIUM-LABEL: constraint_m_with_extern_weak_global_2:
354; RV32I-MEDIUM:       # %bb.0:
355; RV32I-MEDIUM-NEXT:  .Lpcrel_hi4:
356; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
357; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi4)(a0)
358; RV32I-MEDIUM-NEXT:    #APP
359; RV32I-MEDIUM-NEXT:    sw zero, 4(a0)
360; RV32I-MEDIUM-NEXT:    #NO_APP
361; RV32I-MEDIUM-NEXT:    ret
362;
363; RV64I-MEDIUM-LABEL: constraint_m_with_extern_weak_global_2:
364; RV64I-MEDIUM:       # %bb.0:
365; RV64I-MEDIUM-NEXT:  .Lpcrel_hi4:
366; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
367; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi4)(a0)
368; RV64I-MEDIUM-NEXT:    #APP
369; RV64I-MEDIUM-NEXT:    sw zero, 4(a0)
370; RV64I-MEDIUM-NEXT:    #NO_APP
371; RV64I-MEDIUM-NEXT:    ret
372;
373; RV64I-LARGE-LABEL: constraint_m_with_extern_weak_global_2:
374; RV64I-LARGE:       # %bb.0:
375; RV64I-LARGE-NEXT:  .Lpcrel_hi4:
376; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI7_0)
377; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi4)(a0)
378; RV64I-LARGE-NEXT:    #APP
379; RV64I-LARGE-NEXT:    sw zero, 4(a0)
380; RV64I-LARGE-NEXT:    #NO_APP
381; RV64I-LARGE-NEXT:    ret
382  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @ewg, i32 0, i32 1))
383  ret void
384}
385
386define void @constraint_m_with_extern_weak_global_3() nounwind {
387; RV32I-LABEL: constraint_m_with_extern_weak_global_3:
388; RV32I:       # %bb.0:
389; RV32I-NEXT:    lui a0, %hi(ewg+8000)
390; RV32I-NEXT:    #APP
391; RV32I-NEXT:    sw zero, %lo(ewg+8000)(a0)
392; RV32I-NEXT:    #NO_APP
393; RV32I-NEXT:    ret
394;
395; RV64I-LABEL: constraint_m_with_extern_weak_global_3:
396; RV64I:       # %bb.0:
397; RV64I-NEXT:    lui a0, %hi(ewg+8000)
398; RV64I-NEXT:    #APP
399; RV64I-NEXT:    sw zero, %lo(ewg+8000)(a0)
400; RV64I-NEXT:    #NO_APP
401; RV64I-NEXT:    ret
402;
403; RV32I-MEDIUM-LABEL: constraint_m_with_extern_weak_global_3:
404; RV32I-MEDIUM:       # %bb.0:
405; RV32I-MEDIUM-NEXT:  .Lpcrel_hi5:
406; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
407; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi5)(a0)
408; RV32I-MEDIUM-NEXT:    lui a1, 2
409; RV32I-MEDIUM-NEXT:    addi a1, a1, -192
410; RV32I-MEDIUM-NEXT:    add a0, a0, a1
411; RV32I-MEDIUM-NEXT:    #APP
412; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
413; RV32I-MEDIUM-NEXT:    #NO_APP
414; RV32I-MEDIUM-NEXT:    ret
415;
416; RV64I-MEDIUM-LABEL: constraint_m_with_extern_weak_global_3:
417; RV64I-MEDIUM:       # %bb.0:
418; RV64I-MEDIUM-NEXT:  .Lpcrel_hi5:
419; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
420; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi5)(a0)
421; RV64I-MEDIUM-NEXT:    lui a1, 2
422; RV64I-MEDIUM-NEXT:    addiw a1, a1, -192
423; RV64I-MEDIUM-NEXT:    add a0, a0, a1
424; RV64I-MEDIUM-NEXT:    #APP
425; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
426; RV64I-MEDIUM-NEXT:    #NO_APP
427; RV64I-MEDIUM-NEXT:    ret
428;
429; RV64I-LARGE-LABEL: constraint_m_with_extern_weak_global_3:
430; RV64I-LARGE:       # %bb.0:
431; RV64I-LARGE-NEXT:  .Lpcrel_hi5:
432; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI8_0)
433; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi5)(a0)
434; RV64I-LARGE-NEXT:    lui a1, 2
435; RV64I-LARGE-NEXT:    addiw a1, a1, -192
436; RV64I-LARGE-NEXT:    add a0, a0, a1
437; RV64I-LARGE-NEXT:    #APP
438; RV64I-LARGE-NEXT:    sw zero, 0(a0)
439; RV64I-LARGE-NEXT:    #NO_APP
440; RV64I-LARGE-NEXT:    ret
441  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @ewg, i32 0, i32 2000))
442  ret void
443}
444
445define void @constraint_m_with_local_1() nounwind {
446; RV32I-LABEL: constraint_m_with_local_1:
447; RV32I:       # %bb.0: # %entry
448; RV32I-NEXT:  .Ltmp0: # Block address taken
449; RV32I-NEXT:  # %bb.1: # %label
450; RV32I-NEXT:    lui a0, %hi(.Ltmp0)
451; RV32I-NEXT:    #APP
452; RV32I-NEXT:    lw zero, %lo(.Ltmp0)(a0)
453; RV32I-NEXT:    #NO_APP
454; RV32I-NEXT:    ret
455;
456; RV64I-LABEL: constraint_m_with_local_1:
457; RV64I:       # %bb.0: # %entry
458; RV64I-NEXT:  .Ltmp0: # Block address taken
459; RV64I-NEXT:  # %bb.1: # %label
460; RV64I-NEXT:    lui a0, %hi(.Ltmp0)
461; RV64I-NEXT:    #APP
462; RV64I-NEXT:    lw zero, %lo(.Ltmp0)(a0)
463; RV64I-NEXT:    #NO_APP
464; RV64I-NEXT:    ret
465;
466; RV32I-MEDIUM-LABEL: constraint_m_with_local_1:
467; RV32I-MEDIUM:       # %bb.0: # %entry
468; RV32I-MEDIUM-NEXT:  .Ltmp0: # Block address taken
469; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
470; RV32I-MEDIUM-NEXT:  .Lpcrel_hi6:
471; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
472; RV32I-MEDIUM-NEXT:    #APP
473; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
474; RV32I-MEDIUM-NEXT:    #NO_APP
475; RV32I-MEDIUM-NEXT:    ret
476;
477; RV64I-MEDIUM-LABEL: constraint_m_with_local_1:
478; RV64I-MEDIUM:       # %bb.0: # %entry
479; RV64I-MEDIUM-NEXT:  .Ltmp0: # Block address taken
480; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
481; RV64I-MEDIUM-NEXT:  .Lpcrel_hi6:
482; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
483; RV64I-MEDIUM-NEXT:    #APP
484; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
485; RV64I-MEDIUM-NEXT:    #NO_APP
486; RV64I-MEDIUM-NEXT:    ret
487;
488; RV64I-LARGE-LABEL: constraint_m_with_local_1:
489; RV64I-LARGE:       # %bb.0: # %entry
490; RV64I-LARGE-NEXT:  .Ltmp0: # Block address taken
491; RV64I-LARGE-NEXT:  # %bb.1: # %label
492; RV64I-LARGE-NEXT:  .Lpcrel_hi6:
493; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
494; RV64I-LARGE-NEXT:    #APP
495; RV64I-LARGE-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
496; RV64I-LARGE-NEXT:    #NO_APP
497; RV64I-LARGE-NEXT:    ret
498entry:
499  br label %label
500
501label:
502  tail call void asm sideeffect "lw zero, $0", "*m"(ptr elementtype(ptr) blockaddress(@constraint_m_with_local_1, %label))
503  ret void
504}
505
506define void @constraint_m_with_local_2() nounwind {
507; RV32I-LABEL: constraint_m_with_local_2:
508; RV32I:       # %bb.0: # %entry
509; RV32I-NEXT:  .Ltmp1: # Block address taken
510; RV32I-NEXT:  # %bb.1: # %label
511; RV32I-NEXT:    lui a0, %hi(.Ltmp1+4)
512; RV32I-NEXT:    #APP
513; RV32I-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
514; RV32I-NEXT:    #NO_APP
515; RV32I-NEXT:    ret
516;
517; RV64I-LABEL: constraint_m_with_local_2:
518; RV64I:       # %bb.0: # %entry
519; RV64I-NEXT:  .Ltmp1: # Block address taken
520; RV64I-NEXT:  # %bb.1: # %label
521; RV64I-NEXT:    lui a0, %hi(.Ltmp1+4)
522; RV64I-NEXT:    #APP
523; RV64I-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
524; RV64I-NEXT:    #NO_APP
525; RV64I-NEXT:    ret
526;
527; RV32I-MEDIUM-LABEL: constraint_m_with_local_2:
528; RV32I-MEDIUM:       # %bb.0: # %entry
529; RV32I-MEDIUM-NEXT:  .Ltmp1: # Block address taken
530; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
531; RV32I-MEDIUM-NEXT:  .Lpcrel_hi7:
532; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
533; RV32I-MEDIUM-NEXT:    #APP
534; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
535; RV32I-MEDIUM-NEXT:    #NO_APP
536; RV32I-MEDIUM-NEXT:    ret
537;
538; RV64I-MEDIUM-LABEL: constraint_m_with_local_2:
539; RV64I-MEDIUM:       # %bb.0: # %entry
540; RV64I-MEDIUM-NEXT:  .Ltmp1: # Block address taken
541; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
542; RV64I-MEDIUM-NEXT:  .Lpcrel_hi7:
543; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
544; RV64I-MEDIUM-NEXT:    #APP
545; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
546; RV64I-MEDIUM-NEXT:    #NO_APP
547; RV64I-MEDIUM-NEXT:    ret
548;
549; RV64I-LARGE-LABEL: constraint_m_with_local_2:
550; RV64I-LARGE:       # %bb.0: # %entry
551; RV64I-LARGE-NEXT:  .Ltmp1: # Block address taken
552; RV64I-LARGE-NEXT:  # %bb.1: # %label
553; RV64I-LARGE-NEXT:  .Lpcrel_hi7:
554; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
555; RV64I-LARGE-NEXT:    #APP
556; RV64I-LARGE-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
557; RV64I-LARGE-NEXT:    #NO_APP
558; RV64I-LARGE-NEXT:    ret
559entry:
560  br label %label
561
562label:
563  call void asm "lw zero, $0", "*m"(ptr elementtype(i32) getelementptr (i8, ptr blockaddress(@constraint_m_with_local_2, %label), i32 4))
564  ret void
565}
566
567define void @constraint_m_with_local_3() nounwind {
568; RV32I-LABEL: constraint_m_with_local_3:
569; RV32I:       # %bb.0: # %entry
570; RV32I-NEXT:  .Ltmp2: # Block address taken
571; RV32I-NEXT:  # %bb.1: # %label
572; RV32I-NEXT:    lui a0, %hi(.Ltmp2+2000)
573; RV32I-NEXT:    #APP
574; RV32I-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
575; RV32I-NEXT:    #NO_APP
576; RV32I-NEXT:    ret
577;
578; RV64I-LABEL: constraint_m_with_local_3:
579; RV64I:       # %bb.0: # %entry
580; RV64I-NEXT:  .Ltmp2: # Block address taken
581; RV64I-NEXT:  # %bb.1: # %label
582; RV64I-NEXT:    lui a0, %hi(.Ltmp2+2000)
583; RV64I-NEXT:    #APP
584; RV64I-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
585; RV64I-NEXT:    #NO_APP
586; RV64I-NEXT:    ret
587;
588; RV32I-MEDIUM-LABEL: constraint_m_with_local_3:
589; RV32I-MEDIUM:       # %bb.0: # %entry
590; RV32I-MEDIUM-NEXT:  .Ltmp2: # Block address taken
591; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
592; RV32I-MEDIUM-NEXT:  .Lpcrel_hi8:
593; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
594; RV32I-MEDIUM-NEXT:    #APP
595; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
596; RV32I-MEDIUM-NEXT:    #NO_APP
597; RV32I-MEDIUM-NEXT:    ret
598;
599; RV64I-MEDIUM-LABEL: constraint_m_with_local_3:
600; RV64I-MEDIUM:       # %bb.0: # %entry
601; RV64I-MEDIUM-NEXT:  .Ltmp2: # Block address taken
602; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
603; RV64I-MEDIUM-NEXT:  .Lpcrel_hi8:
604; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
605; RV64I-MEDIUM-NEXT:    #APP
606; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
607; RV64I-MEDIUM-NEXT:    #NO_APP
608; RV64I-MEDIUM-NEXT:    ret
609;
610; RV64I-LARGE-LABEL: constraint_m_with_local_3:
611; RV64I-LARGE:       # %bb.0: # %entry
612; RV64I-LARGE-NEXT:  .Ltmp2: # Block address taken
613; RV64I-LARGE-NEXT:  # %bb.1: # %label
614; RV64I-LARGE-NEXT:  .Lpcrel_hi8:
615; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
616; RV64I-LARGE-NEXT:    #APP
617; RV64I-LARGE-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
618; RV64I-LARGE-NEXT:    #NO_APP
619; RV64I-LARGE-NEXT:    ret
620entry:
621  br label %label
622
623label:
624  call void asm "lw zero, $0", "*m"(ptr elementtype(i32) getelementptr (i8, ptr blockaddress(@constraint_m_with_local_3, %label), i32 2000))
625  ret void
626}
627
628define void @constraint_m_with_multi_operands() nounwind {
629; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
630; RV32I-NO-INTEGRATED:       # %bb.0:
631; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(eg)
632; RV32I-NO-INTEGRATED-NEXT:    #APP
633; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0); sw zero, %lo(eg)(a0)
634; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
635; RV32I-NO-INTEGRATED-NEXT:    ret
636;
637; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
638; RV64I-NO-INTEGRATED:       # %bb.0:
639; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(eg)
640; RV64I-NO-INTEGRATED-NEXT:    #APP
641; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0); sw zero, %lo(eg)(a0)
642; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
643; RV64I-NO-INTEGRATED-NEXT:    ret
644;
645; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
646; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
647; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi9:
648; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
649; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
650; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0); sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
651; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
652; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
653;
654; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
655; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
656; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi9:
657; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
658; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
659; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0); sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
660; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
661; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
662;
663; RV64I-LARGE-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
664; RV64I-LARGE-NO-INTEGRATED:       # %bb.0:
665; RV64I-LARGE-NO-INTEGRATED-NEXT:  .Lpcrel_hi9:
666; RV64I-LARGE-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.LCPI12_0)
667; RV64I-LARGE-NO-INTEGRATED-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi9)(a0)
668; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
669; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a0); sw zero, 0(a0)
670; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
671; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
672;
673; RV32I-INTEGRATED-LABEL: constraint_m_with_multi_operands:
674; RV32I-INTEGRATED:       # %bb.0:
675; RV32I-INTEGRATED-NEXT:    lui a0, %hi(eg)
676; RV32I-INTEGRATED-NEXT:    #APP
677; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
678; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
679; RV32I-INTEGRATED-NEXT:    #NO_APP
680; RV32I-INTEGRATED-NEXT:    ret
681;
682; RV64I-INTEGRATED-LABEL: constraint_m_with_multi_operands:
683; RV64I-INTEGRATED:       # %bb.0:
684; RV64I-INTEGRATED-NEXT:    lui a0, %hi(eg)
685; RV64I-INTEGRATED-NEXT:    #APP
686; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
687; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
688; RV64I-INTEGRATED-NEXT:    #NO_APP
689; RV64I-INTEGRATED-NEXT:    ret
690;
691; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_operands:
692; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
693; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi9:
694; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
695; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
696; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
697; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
698; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
699; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
700;
701; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_operands:
702; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
703; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi9:
704; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
705; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
706; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
707; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
708; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
709; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
710;
711; RV64I-LARGE-INTEGRATED-LABEL: constraint_m_with_multi_operands:
712; RV64I-LARGE-INTEGRATED:       # %bb.0:
713; RV64I-LARGE-INTEGRATED-NEXT:  .Lpcrel_hi9:
714; RV64I-LARGE-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.LCPI12_0)
715; RV64I-LARGE-INTEGRATED-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi9)(a0)
716; RV64I-LARGE-INTEGRATED-NEXT:    #APP
717; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a0)
718; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a0)
719; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
720; RV64I-LARGE-INTEGRATED-NEXT:    ret
721  call void asm "sw zero, $0; sw zero, $1", "=*m,=*m"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg)
722  ret void
723}
724
725define void @constraint_m_with_multi_asm() nounwind {
726; RV32I-LABEL: constraint_m_with_multi_asm:
727; RV32I:       # %bb.0:
728; RV32I-NEXT:    lui a0, %hi(eg)
729; RV32I-NEXT:    #APP
730; RV32I-NEXT:    sw zero, %lo(eg)(a0)
731; RV32I-NEXT:    #NO_APP
732; RV32I-NEXT:    #APP
733; RV32I-NEXT:    sw zero, %lo(eg)(a0)
734; RV32I-NEXT:    #NO_APP
735; RV32I-NEXT:    ret
736;
737; RV64I-LABEL: constraint_m_with_multi_asm:
738; RV64I:       # %bb.0:
739; RV64I-NEXT:    lui a0, %hi(eg)
740; RV64I-NEXT:    #APP
741; RV64I-NEXT:    sw zero, %lo(eg)(a0)
742; RV64I-NEXT:    #NO_APP
743; RV64I-NEXT:    #APP
744; RV64I-NEXT:    sw zero, %lo(eg)(a0)
745; RV64I-NEXT:    #NO_APP
746; RV64I-NEXT:    ret
747;
748; RV32I-MEDIUM-LABEL: constraint_m_with_multi_asm:
749; RV32I-MEDIUM:       # %bb.0:
750; RV32I-MEDIUM-NEXT:  .Lpcrel_hi10:
751; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
752; RV32I-MEDIUM-NEXT:    #APP
753; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
754; RV32I-MEDIUM-NEXT:    #NO_APP
755; RV32I-MEDIUM-NEXT:    #APP
756; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
757; RV32I-MEDIUM-NEXT:    #NO_APP
758; RV32I-MEDIUM-NEXT:    ret
759;
760; RV64I-MEDIUM-LABEL: constraint_m_with_multi_asm:
761; RV64I-MEDIUM:       # %bb.0:
762; RV64I-MEDIUM-NEXT:  .Lpcrel_hi10:
763; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
764; RV64I-MEDIUM-NEXT:    #APP
765; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
766; RV64I-MEDIUM-NEXT:    #NO_APP
767; RV64I-MEDIUM-NEXT:    #APP
768; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
769; RV64I-MEDIUM-NEXT:    #NO_APP
770; RV64I-MEDIUM-NEXT:    ret
771;
772; RV64I-LARGE-LABEL: constraint_m_with_multi_asm:
773; RV64I-LARGE:       # %bb.0:
774; RV64I-LARGE-NEXT:  .Lpcrel_hi10:
775; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI13_0)
776; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi10)(a0)
777; RV64I-LARGE-NEXT:    #APP
778; RV64I-LARGE-NEXT:    sw zero, 0(a0)
779; RV64I-LARGE-NEXT:    #NO_APP
780; RV64I-LARGE-NEXT:    #APP
781; RV64I-LARGE-NEXT:    sw zero, 0(a0)
782; RV64I-LARGE-NEXT:    #NO_APP
783; RV64I-LARGE-NEXT:    ret
784  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
785  call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
786  ret void
787}
788
789define i32 @constraint_m_with_callbr_multi_operands(i32 %a) {
790; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
791; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
792; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
793; RV32I-NO-INTEGRATED-NEXT:    #APP
794; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB14_2
795; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
796; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
797; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
798; RV32I-NO-INTEGRATED-NEXT:    ret
799; RV32I-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
800; RV32I-NO-INTEGRATED-NEXT:    # %fail
801; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
802; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
803; RV32I-NO-INTEGRATED-NEXT:    ret
804;
805; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
806; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
807; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
808; RV64I-NO-INTEGRATED-NEXT:    #APP
809; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB14_2
810; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
811; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
812; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
813; RV64I-NO-INTEGRATED-NEXT:    ret
814; RV64I-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
815; RV64I-NO-INTEGRATED-NEXT:    # %fail
816; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
817; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
818; RV64I-NO-INTEGRATED-NEXT:    ret
819;
820; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
821; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
822; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi11:
823; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
824; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
825; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); beqz a0, .LBB14_2
826; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
827; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
828; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
829; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
830; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
831; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
832; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
833; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
834; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
835;
836; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
837; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
838; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi11:
839; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
840; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
841; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); beqz a0, .LBB14_2
842; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
843; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
844; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
845; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
846; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
847; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
848; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
849; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
850; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
851;
852; RV64I-LARGE-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
853; RV64I-LARGE-NO-INTEGRATED:       # %bb.0: # %entry
854; RV64I-LARGE-NO-INTEGRATED-NEXT:  .Lpcrel_hi11:
855; RV64I-LARGE-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI14_0)
856; RV64I-LARGE-NO-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi11)(a1)
857; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
858; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB14_2
859; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
860; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
861; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 0
862; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
863; RV64I-LARGE-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
864; RV64I-LARGE-NO-INTEGRATED-NEXT:    # %fail
865; RV64I-LARGE-NO-INTEGRATED-NEXT:    # Label of block must be emitted
866; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 1
867; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
868;
869; RV32I-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
870; RV32I-INTEGRATED:       # %bb.0: # %entry
871; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
872; RV32I-INTEGRATED-NEXT:    #APP
873; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
874; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
875; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB14_2
876; RV32I-INTEGRATED-NEXT:    #NO_APP
877; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal
878; RV32I-INTEGRATED-NEXT:    li a0, 0
879; RV32I-INTEGRATED-NEXT:    ret
880; RV32I-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
881; RV32I-INTEGRATED-NEXT:    # %fail
882; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
883; RV32I-INTEGRATED-NEXT:    li a0, 1
884; RV32I-INTEGRATED-NEXT:    ret
885;
886; RV64I-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
887; RV64I-INTEGRATED:       # %bb.0: # %entry
888; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
889; RV64I-INTEGRATED-NEXT:    #APP
890; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
891; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
892; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB14_2
893; RV64I-INTEGRATED-NEXT:    #NO_APP
894; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal
895; RV64I-INTEGRATED-NEXT:    li a0, 0
896; RV64I-INTEGRATED-NEXT:    ret
897; RV64I-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
898; RV64I-INTEGRATED-NEXT:    # %fail
899; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
900; RV64I-INTEGRATED-NEXT:    li a0, 1
901; RV64I-INTEGRATED-NEXT:    ret
902;
903; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
904; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
905; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi11:
906; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
907; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
908; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
909; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
910; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB14_2
911; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
912; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
913; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
914; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
915; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
916; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
917; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
918; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
919; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
920;
921; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
922; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
923; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi11:
924; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
925; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
926; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
927; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
928; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB14_2
929; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
930; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
931; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
932; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
933; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
934; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
935; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
936; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
937; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
938;
939; RV64I-LARGE-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
940; RV64I-LARGE-INTEGRATED:       # %bb.0: # %entry
941; RV64I-LARGE-INTEGRATED-NEXT:  .Lpcrel_hi11:
942; RV64I-LARGE-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI14_0)
943; RV64I-LARGE-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi11)(a1)
944; RV64I-LARGE-INTEGRATED-NEXT:    #APP
945; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
946; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
947; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB14_2
948; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
949; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.1: # %normal
950; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 0
951; RV64I-LARGE-INTEGRATED-NEXT:    ret
952; RV64I-LARGE-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
953; RV64I-LARGE-INTEGRATED-NEXT:    # %fail
954; RV64I-LARGE-INTEGRATED-NEXT:    # Label of block must be emitted
955; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 1
956; RV64I-LARGE-INTEGRATED-NEXT:    ret
957entry:
958  callbr void asm "sw zero, $0; sw zero, $1; beqz $2, $3", "=*m,=*m,r,!i"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg, i32 %a) to label %normal [label %fail]
959
960normal:
961  ret i32 0
962
963fail:
964  ret i32 1
965}
966
967define i32 @constraint_m_with_multi_callbr_asm(i32 %a) {
968; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
969; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
970; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
971; RV32I-NO-INTEGRATED-NEXT:    #APP
972; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
973; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
974; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
975; RV32I-NO-INTEGRATED-NEXT:    #APP
976; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
977; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
978; RV32I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
979; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
980; RV32I-NO-INTEGRATED-NEXT:    ret
981; RV32I-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
982; RV32I-NO-INTEGRATED-NEXT:    # %fail
983; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
984; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
985; RV32I-NO-INTEGRATED-NEXT:    ret
986;
987; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
988; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
989; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
990; RV64I-NO-INTEGRATED-NEXT:    #APP
991; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
992; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
993; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
994; RV64I-NO-INTEGRATED-NEXT:    #APP
995; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
996; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
997; RV64I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
998; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
999; RV64I-NO-INTEGRATED-NEXT:    ret
1000; RV64I-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1001; RV64I-NO-INTEGRATED-NEXT:    # %fail
1002; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1003; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
1004; RV64I-NO-INTEGRATED-NEXT:    ret
1005;
1006; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1007; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
1008; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi12:
1009; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1010; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1011; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
1012; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1013; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1014; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1015; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
1016; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1017; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1018; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
1019; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1020; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1021; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
1022; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1023; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
1024; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1025;
1026; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1027; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
1028; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi12:
1029; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1030; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1031; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
1032; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1033; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1034; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1035; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
1036; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1037; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1038; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
1039; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1040; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1041; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
1042; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1043; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
1044; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1045;
1046; RV64I-LARGE-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1047; RV64I-LARGE-NO-INTEGRATED:       # %bb.0: # %entry
1048; RV64I-LARGE-NO-INTEGRATED-NEXT:  .Lpcrel_hi12:
1049; RV64I-LARGE-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI15_0)
1050; RV64I-LARGE-NO-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi12)(a1)
1051; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
1052; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB15_3
1053; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
1054; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1055; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
1056; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB15_3
1057; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
1058; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1059; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 0
1060; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
1061; RV64I-LARGE-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1062; RV64I-LARGE-NO-INTEGRATED-NEXT:    # %fail
1063; RV64I-LARGE-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1064; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 1
1065; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
1066;
1067; RV32I-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1068; RV32I-INTEGRATED:       # %bb.0: # %entry
1069; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
1070; RV32I-INTEGRATED-NEXT:    #APP
1071; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1072; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1073; RV32I-INTEGRATED-NEXT:    #NO_APP
1074; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal0
1075; RV32I-INTEGRATED-NEXT:    #APP
1076; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1077; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1078; RV32I-INTEGRATED-NEXT:    #NO_APP
1079; RV32I-INTEGRATED-NEXT:  # %bb.2: # %normal1
1080; RV32I-INTEGRATED-NEXT:    li a0, 0
1081; RV32I-INTEGRATED-NEXT:    ret
1082; RV32I-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1083; RV32I-INTEGRATED-NEXT:    # %fail
1084; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
1085; RV32I-INTEGRATED-NEXT:    li a0, 1
1086; RV32I-INTEGRATED-NEXT:    ret
1087;
1088; RV64I-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1089; RV64I-INTEGRATED:       # %bb.0: # %entry
1090; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
1091; RV64I-INTEGRATED-NEXT:    #APP
1092; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1093; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1094; RV64I-INTEGRATED-NEXT:    #NO_APP
1095; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal0
1096; RV64I-INTEGRATED-NEXT:    #APP
1097; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1098; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1099; RV64I-INTEGRATED-NEXT:    #NO_APP
1100; RV64I-INTEGRATED-NEXT:  # %bb.2: # %normal1
1101; RV64I-INTEGRATED-NEXT:    li a0, 0
1102; RV64I-INTEGRATED-NEXT:    ret
1103; RV64I-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1104; RV64I-INTEGRATED-NEXT:    # %fail
1105; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
1106; RV64I-INTEGRATED-NEXT:    li a0, 1
1107; RV64I-INTEGRATED-NEXT:    ret
1108;
1109; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1110; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
1111; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi12:
1112; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1113; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
1114; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
1115; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1116; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
1117; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
1118; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
1119; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
1120; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1121; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
1122; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
1123; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
1124; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
1125; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1126; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
1127; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
1128; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
1129; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
1130;
1131; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1132; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
1133; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi12:
1134; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1135; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
1136; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
1137; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1138; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
1139; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
1140; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
1141; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
1142; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1143; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
1144; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
1145; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
1146; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
1147; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1148; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
1149; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
1150; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
1151; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
1152;
1153; RV64I-LARGE-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
1154; RV64I-LARGE-INTEGRATED:       # %bb.0: # %entry
1155; RV64I-LARGE-INTEGRATED-NEXT:  .Lpcrel_hi12:
1156; RV64I-LARGE-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI15_0)
1157; RV64I-LARGE-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi12)(a1)
1158; RV64I-LARGE-INTEGRATED-NEXT:    #APP
1159; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
1160; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1161; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
1162; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.1: # %normal0
1163; RV64I-LARGE-INTEGRATED-NEXT:    #APP
1164; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
1165; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB15_3
1166; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
1167; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.2: # %normal1
1168; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 0
1169; RV64I-LARGE-INTEGRATED-NEXT:    ret
1170; RV64I-LARGE-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
1171; RV64I-LARGE-INTEGRATED-NEXT:    # %fail
1172; RV64I-LARGE-INTEGRATED-NEXT:    # Label of block must be emitted
1173; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 1
1174; RV64I-LARGE-INTEGRATED-NEXT:    ret
1175entry:
1176  callbr void asm "sw zero, $0; beqz $1, $2", "=*m,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal0 [label %fail]
1177
1178normal0:
1179  callbr void asm "sw zero, $0; beqz $1, $2", "=*m,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal1 [label %fail]
1180
1181normal1:
1182  ret i32 0
1183
1184fail:
1185  ret i32 1
1186}
1187
1188define void @constraint_o_1(ptr %a) nounwind {
1189; RV32I-LABEL: constraint_o_1:
1190; RV32I:       # %bb.0:
1191; RV32I-NEXT:    #APP
1192; RV32I-NEXT:    #NO_APP
1193; RV32I-NEXT:    ret
1194;
1195; RV64I-LABEL: constraint_o_1:
1196; RV64I:       # %bb.0:
1197; RV64I-NEXT:    #APP
1198; RV64I-NEXT:    #NO_APP
1199; RV64I-NEXT:    ret
1200;
1201; RV32I-MEDIUM-LABEL: constraint_o_1:
1202; RV32I-MEDIUM:       # %bb.0:
1203; RV32I-MEDIUM-NEXT:    #APP
1204; RV32I-MEDIUM-NEXT:    #NO_APP
1205; RV32I-MEDIUM-NEXT:    ret
1206;
1207; RV64I-MEDIUM-LABEL: constraint_o_1:
1208; RV64I-MEDIUM:       # %bb.0:
1209; RV64I-MEDIUM-NEXT:    #APP
1210; RV64I-MEDIUM-NEXT:    #NO_APP
1211; RV64I-MEDIUM-NEXT:    ret
1212;
1213; RV64I-LARGE-LABEL: constraint_o_1:
1214; RV64I-LARGE:       # %bb.0:
1215; RV64I-LARGE-NEXT:    #APP
1216; RV64I-LARGE-NEXT:    #NO_APP
1217; RV64I-LARGE-NEXT:    ret
1218  call void asm sideeffect "", "=*o"(ptr elementtype(i32) %a)
1219  ret void
1220}
1221
1222define i32 @constraint_o_2(ptr %a) nounwind {
1223; RV32I-LABEL: constraint_o_2:
1224; RV32I:       # %bb.0:
1225; RV32I-NEXT:    #APP
1226; RV32I-NEXT:    lw a0, 0(a0)
1227; RV32I-NEXT:    #NO_APP
1228; RV32I-NEXT:    ret
1229;
1230; RV64I-LABEL: constraint_o_2:
1231; RV64I:       # %bb.0:
1232; RV64I-NEXT:    #APP
1233; RV64I-NEXT:    lw a0, 0(a0)
1234; RV64I-NEXT:    #NO_APP
1235; RV64I-NEXT:    ret
1236;
1237; RV32I-MEDIUM-LABEL: constraint_o_2:
1238; RV32I-MEDIUM:       # %bb.0:
1239; RV32I-MEDIUM-NEXT:    #APP
1240; RV32I-MEDIUM-NEXT:    lw a0, 0(a0)
1241; RV32I-MEDIUM-NEXT:    #NO_APP
1242; RV32I-MEDIUM-NEXT:    ret
1243;
1244; RV64I-MEDIUM-LABEL: constraint_o_2:
1245; RV64I-MEDIUM:       # %bb.0:
1246; RV64I-MEDIUM-NEXT:    #APP
1247; RV64I-MEDIUM-NEXT:    lw a0, 0(a0)
1248; RV64I-MEDIUM-NEXT:    #NO_APP
1249; RV64I-MEDIUM-NEXT:    ret
1250;
1251; RV64I-LARGE-LABEL: constraint_o_2:
1252; RV64I-LARGE:       # %bb.0:
1253; RV64I-LARGE-NEXT:    #APP
1254; RV64I-LARGE-NEXT:    lw a0, 0(a0)
1255; RV64I-LARGE-NEXT:    #NO_APP
1256; RV64I-LARGE-NEXT:    ret
1257  %1 = tail call i32 asm "lw $0, $1", "=r,*o"(ptr elementtype(i32) %a)
1258  ret i32 %1
1259}
1260
1261define i32 @constraint_o_with_offset(ptr %a) nounwind {
1262; RV32I-LABEL: constraint_o_with_offset:
1263; RV32I:       # %bb.0:
1264; RV32I-NEXT:    #APP
1265; RV32I-NEXT:    lw a0, 4(a0)
1266; RV32I-NEXT:    #NO_APP
1267; RV32I-NEXT:    ret
1268;
1269; RV64I-LABEL: constraint_o_with_offset:
1270; RV64I:       # %bb.0:
1271; RV64I-NEXT:    #APP
1272; RV64I-NEXT:    lw a0, 4(a0)
1273; RV64I-NEXT:    #NO_APP
1274; RV64I-NEXT:    ret
1275;
1276; RV32I-MEDIUM-LABEL: constraint_o_with_offset:
1277; RV32I-MEDIUM:       # %bb.0:
1278; RV32I-MEDIUM-NEXT:    #APP
1279; RV32I-MEDIUM-NEXT:    lw a0, 4(a0)
1280; RV32I-MEDIUM-NEXT:    #NO_APP
1281; RV32I-MEDIUM-NEXT:    ret
1282;
1283; RV64I-MEDIUM-LABEL: constraint_o_with_offset:
1284; RV64I-MEDIUM:       # %bb.0:
1285; RV64I-MEDIUM-NEXT:    #APP
1286; RV64I-MEDIUM-NEXT:    lw a0, 4(a0)
1287; RV64I-MEDIUM-NEXT:    #NO_APP
1288; RV64I-MEDIUM-NEXT:    ret
1289;
1290; RV64I-LARGE-LABEL: constraint_o_with_offset:
1291; RV64I-LARGE:       # %bb.0:
1292; RV64I-LARGE-NEXT:    #APP
1293; RV64I-LARGE-NEXT:    lw a0, 4(a0)
1294; RV64I-LARGE-NEXT:    #NO_APP
1295; RV64I-LARGE-NEXT:    ret
1296  %1 = getelementptr i32, ptr %a, i32 1
1297  %2 = tail call i32 asm "lw $0, $1", "=r,*o"(ptr elementtype(i32) %1)
1298  ret i32 %2
1299}
1300
1301define void @constraint_o_with_global_1() nounwind {
1302; RV32I-LABEL: constraint_o_with_global_1:
1303; RV32I:       # %bb.0:
1304; RV32I-NEXT:    lui a0, %hi(eg)
1305; RV32I-NEXT:    #APP
1306; RV32I-NEXT:    sw zero, %lo(eg)(a0)
1307; RV32I-NEXT:    #NO_APP
1308; RV32I-NEXT:    ret
1309;
1310; RV64I-LABEL: constraint_o_with_global_1:
1311; RV64I:       # %bb.0:
1312; RV64I-NEXT:    lui a0, %hi(eg)
1313; RV64I-NEXT:    #APP
1314; RV64I-NEXT:    sw zero, %lo(eg)(a0)
1315; RV64I-NEXT:    #NO_APP
1316; RV64I-NEXT:    ret
1317;
1318; RV32I-MEDIUM-LABEL: constraint_o_with_global_1:
1319; RV32I-MEDIUM:       # %bb.0:
1320; RV32I-MEDIUM-NEXT:  .Lpcrel_hi13:
1321; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
1322; RV32I-MEDIUM-NEXT:    #APP
1323; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
1324; RV32I-MEDIUM-NEXT:    #NO_APP
1325; RV32I-MEDIUM-NEXT:    ret
1326;
1327; RV64I-MEDIUM-LABEL: constraint_o_with_global_1:
1328; RV64I-MEDIUM:       # %bb.0:
1329; RV64I-MEDIUM-NEXT:  .Lpcrel_hi13:
1330; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
1331; RV64I-MEDIUM-NEXT:    #APP
1332; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
1333; RV64I-MEDIUM-NEXT:    #NO_APP
1334; RV64I-MEDIUM-NEXT:    ret
1335;
1336; RV64I-LARGE-LABEL: constraint_o_with_global_1:
1337; RV64I-LARGE:       # %bb.0:
1338; RV64I-LARGE-NEXT:  .Lpcrel_hi13:
1339; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI19_0)
1340; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi13)(a0)
1341; RV64I-LARGE-NEXT:    #APP
1342; RV64I-LARGE-NEXT:    sw zero, 0(a0)
1343; RV64I-LARGE-NEXT:    #NO_APP
1344; RV64I-LARGE-NEXT:    ret
1345  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
1346  ret void
1347}
1348
1349define void @constraint_o_with_global_2() nounwind {
1350; RV32I-LABEL: constraint_o_with_global_2:
1351; RV32I:       # %bb.0:
1352; RV32I-NEXT:    lui a0, %hi(eg+4)
1353; RV32I-NEXT:    #APP
1354; RV32I-NEXT:    sw zero, %lo(eg+4)(a0)
1355; RV32I-NEXT:    #NO_APP
1356; RV32I-NEXT:    ret
1357;
1358; RV64I-LABEL: constraint_o_with_global_2:
1359; RV64I:       # %bb.0:
1360; RV64I-NEXT:    lui a0, %hi(eg+4)
1361; RV64I-NEXT:    #APP
1362; RV64I-NEXT:    sw zero, %lo(eg+4)(a0)
1363; RV64I-NEXT:    #NO_APP
1364; RV64I-NEXT:    ret
1365;
1366; RV32I-MEDIUM-LABEL: constraint_o_with_global_2:
1367; RV32I-MEDIUM:       # %bb.0:
1368; RV32I-MEDIUM-NEXT:  .Lpcrel_hi14:
1369; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
1370; RV32I-MEDIUM-NEXT:    #APP
1371; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
1372; RV32I-MEDIUM-NEXT:    #NO_APP
1373; RV32I-MEDIUM-NEXT:    ret
1374;
1375; RV64I-MEDIUM-LABEL: constraint_o_with_global_2:
1376; RV64I-MEDIUM:       # %bb.0:
1377; RV64I-MEDIUM-NEXT:  .Lpcrel_hi14:
1378; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
1379; RV64I-MEDIUM-NEXT:    #APP
1380; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
1381; RV64I-MEDIUM-NEXT:    #NO_APP
1382; RV64I-MEDIUM-NEXT:    ret
1383;
1384; RV64I-LARGE-LABEL: constraint_o_with_global_2:
1385; RV64I-LARGE:       # %bb.0:
1386; RV64I-LARGE-NEXT:  .Lpcrel_hi14:
1387; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI20_0)
1388; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi14)(a0)
1389; RV64I-LARGE-NEXT:    #APP
1390; RV64I-LARGE-NEXT:    sw zero, 4(a0)
1391; RV64I-LARGE-NEXT:    #NO_APP
1392; RV64I-LARGE-NEXT:    ret
1393  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 1))
1394  ret void
1395}
1396
1397define void @constraint_o_with_global_3() nounwind {
1398; RV32I-LABEL: constraint_o_with_global_3:
1399; RV32I:       # %bb.0:
1400; RV32I-NEXT:    lui a0, %hi(eg+8000)
1401; RV32I-NEXT:    #APP
1402; RV32I-NEXT:    sw zero, %lo(eg+8000)(a0)
1403; RV32I-NEXT:    #NO_APP
1404; RV32I-NEXT:    ret
1405;
1406; RV64I-LABEL: constraint_o_with_global_3:
1407; RV64I:       # %bb.0:
1408; RV64I-NEXT:    lui a0, %hi(eg+8000)
1409; RV64I-NEXT:    #APP
1410; RV64I-NEXT:    sw zero, %lo(eg+8000)(a0)
1411; RV64I-NEXT:    #NO_APP
1412; RV64I-NEXT:    ret
1413;
1414; RV32I-MEDIUM-LABEL: constraint_o_with_global_3:
1415; RV32I-MEDIUM:       # %bb.0:
1416; RV32I-MEDIUM-NEXT:  .Lpcrel_hi15:
1417; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
1418; RV32I-MEDIUM-NEXT:    #APP
1419; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
1420; RV32I-MEDIUM-NEXT:    #NO_APP
1421; RV32I-MEDIUM-NEXT:    ret
1422;
1423; RV64I-MEDIUM-LABEL: constraint_o_with_global_3:
1424; RV64I-MEDIUM:       # %bb.0:
1425; RV64I-MEDIUM-NEXT:  .Lpcrel_hi15:
1426; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
1427; RV64I-MEDIUM-NEXT:    #APP
1428; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
1429; RV64I-MEDIUM-NEXT:    #NO_APP
1430; RV64I-MEDIUM-NEXT:    ret
1431;
1432; RV64I-LARGE-LABEL: constraint_o_with_global_3:
1433; RV64I-LARGE:       # %bb.0:
1434; RV64I-LARGE-NEXT:  .Lpcrel_hi15:
1435; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI21_0)
1436; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi15)(a0)
1437; RV64I-LARGE-NEXT:    lui a1, 2
1438; RV64I-LARGE-NEXT:    addiw a1, a1, -192
1439; RV64I-LARGE-NEXT:    add a0, a0, a1
1440; RV64I-LARGE-NEXT:    #APP
1441; RV64I-LARGE-NEXT:    sw zero, 0(a0)
1442; RV64I-LARGE-NEXT:    #NO_APP
1443; RV64I-LARGE-NEXT:    ret
1444  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 2000))
1445  ret void
1446}
1447
1448define void @constraint_o_with_extern_weak_global_1() nounwind {
1449; RV32I-LABEL: constraint_o_with_extern_weak_global_1:
1450; RV32I:       # %bb.0:
1451; RV32I-NEXT:    lui a0, %hi(ewg)
1452; RV32I-NEXT:    #APP
1453; RV32I-NEXT:    sw zero, %lo(ewg)(a0)
1454; RV32I-NEXT:    #NO_APP
1455; RV32I-NEXT:    ret
1456;
1457; RV64I-LABEL: constraint_o_with_extern_weak_global_1:
1458; RV64I:       # %bb.0:
1459; RV64I-NEXT:    lui a0, %hi(ewg)
1460; RV64I-NEXT:    #APP
1461; RV64I-NEXT:    sw zero, %lo(ewg)(a0)
1462; RV64I-NEXT:    #NO_APP
1463; RV64I-NEXT:    ret
1464;
1465; RV32I-MEDIUM-LABEL: constraint_o_with_extern_weak_global_1:
1466; RV32I-MEDIUM:       # %bb.0:
1467; RV32I-MEDIUM-NEXT:  .Lpcrel_hi16:
1468; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
1469; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi16)(a0)
1470; RV32I-MEDIUM-NEXT:    #APP
1471; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
1472; RV32I-MEDIUM-NEXT:    #NO_APP
1473; RV32I-MEDIUM-NEXT:    ret
1474;
1475; RV64I-MEDIUM-LABEL: constraint_o_with_extern_weak_global_1:
1476; RV64I-MEDIUM:       # %bb.0:
1477; RV64I-MEDIUM-NEXT:  .Lpcrel_hi16:
1478; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
1479; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi16)(a0)
1480; RV64I-MEDIUM-NEXT:    #APP
1481; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
1482; RV64I-MEDIUM-NEXT:    #NO_APP
1483; RV64I-MEDIUM-NEXT:    ret
1484;
1485; RV64I-LARGE-LABEL: constraint_o_with_extern_weak_global_1:
1486; RV64I-LARGE:       # %bb.0:
1487; RV64I-LARGE-NEXT:  .Lpcrel_hi16:
1488; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI22_0)
1489; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi16)(a0)
1490; RV64I-LARGE-NEXT:    #APP
1491; RV64I-LARGE-NEXT:    sw zero, 0(a0)
1492; RV64I-LARGE-NEXT:    #NO_APP
1493; RV64I-LARGE-NEXT:    ret
1494  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @ewg)
1495  ret void
1496}
1497
1498define void @constraint_o_with_extern_weak_global_2() nounwind {
1499; RV32I-LABEL: constraint_o_with_extern_weak_global_2:
1500; RV32I:       # %bb.0:
1501; RV32I-NEXT:    lui a0, %hi(ewg+4)
1502; RV32I-NEXT:    #APP
1503; RV32I-NEXT:    sw zero, %lo(ewg+4)(a0)
1504; RV32I-NEXT:    #NO_APP
1505; RV32I-NEXT:    ret
1506;
1507; RV64I-LABEL: constraint_o_with_extern_weak_global_2:
1508; RV64I:       # %bb.0:
1509; RV64I-NEXT:    lui a0, %hi(ewg+4)
1510; RV64I-NEXT:    #APP
1511; RV64I-NEXT:    sw zero, %lo(ewg+4)(a0)
1512; RV64I-NEXT:    #NO_APP
1513; RV64I-NEXT:    ret
1514;
1515; RV32I-MEDIUM-LABEL: constraint_o_with_extern_weak_global_2:
1516; RV32I-MEDIUM:       # %bb.0:
1517; RV32I-MEDIUM-NEXT:  .Lpcrel_hi17:
1518; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
1519; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi17)(a0)
1520; RV32I-MEDIUM-NEXT:    #APP
1521; RV32I-MEDIUM-NEXT:    sw zero, 4(a0)
1522; RV32I-MEDIUM-NEXT:    #NO_APP
1523; RV32I-MEDIUM-NEXT:    ret
1524;
1525; RV64I-MEDIUM-LABEL: constraint_o_with_extern_weak_global_2:
1526; RV64I-MEDIUM:       # %bb.0:
1527; RV64I-MEDIUM-NEXT:  .Lpcrel_hi17:
1528; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
1529; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi17)(a0)
1530; RV64I-MEDIUM-NEXT:    #APP
1531; RV64I-MEDIUM-NEXT:    sw zero, 4(a0)
1532; RV64I-MEDIUM-NEXT:    #NO_APP
1533; RV64I-MEDIUM-NEXT:    ret
1534;
1535; RV64I-LARGE-LABEL: constraint_o_with_extern_weak_global_2:
1536; RV64I-LARGE:       # %bb.0:
1537; RV64I-LARGE-NEXT:  .Lpcrel_hi17:
1538; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI23_0)
1539; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi17)(a0)
1540; RV64I-LARGE-NEXT:    #APP
1541; RV64I-LARGE-NEXT:    sw zero, 4(a0)
1542; RV64I-LARGE-NEXT:    #NO_APP
1543; RV64I-LARGE-NEXT:    ret
1544  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @ewg, i32 0, i32 1))
1545  ret void
1546}
1547
1548define void @constraint_o_with_extern_weak_global_3() nounwind {
1549; RV32I-LABEL: constraint_o_with_extern_weak_global_3:
1550; RV32I:       # %bb.0:
1551; RV32I-NEXT:    lui a0, %hi(ewg+8000)
1552; RV32I-NEXT:    #APP
1553; RV32I-NEXT:    sw zero, %lo(ewg+8000)(a0)
1554; RV32I-NEXT:    #NO_APP
1555; RV32I-NEXT:    ret
1556;
1557; RV64I-LABEL: constraint_o_with_extern_weak_global_3:
1558; RV64I:       # %bb.0:
1559; RV64I-NEXT:    lui a0, %hi(ewg+8000)
1560; RV64I-NEXT:    #APP
1561; RV64I-NEXT:    sw zero, %lo(ewg+8000)(a0)
1562; RV64I-NEXT:    #NO_APP
1563; RV64I-NEXT:    ret
1564;
1565; RV32I-MEDIUM-LABEL: constraint_o_with_extern_weak_global_3:
1566; RV32I-MEDIUM:       # %bb.0:
1567; RV32I-MEDIUM-NEXT:  .Lpcrel_hi18:
1568; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
1569; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi18)(a0)
1570; RV32I-MEDIUM-NEXT:    lui a1, 2
1571; RV32I-MEDIUM-NEXT:    addi a1, a1, -192
1572; RV32I-MEDIUM-NEXT:    add a0, a0, a1
1573; RV32I-MEDIUM-NEXT:    #APP
1574; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
1575; RV32I-MEDIUM-NEXT:    #NO_APP
1576; RV32I-MEDIUM-NEXT:    ret
1577;
1578; RV64I-MEDIUM-LABEL: constraint_o_with_extern_weak_global_3:
1579; RV64I-MEDIUM:       # %bb.0:
1580; RV64I-MEDIUM-NEXT:  .Lpcrel_hi18:
1581; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
1582; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi18)(a0)
1583; RV64I-MEDIUM-NEXT:    lui a1, 2
1584; RV64I-MEDIUM-NEXT:    addiw a1, a1, -192
1585; RV64I-MEDIUM-NEXT:    add a0, a0, a1
1586; RV64I-MEDIUM-NEXT:    #APP
1587; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
1588; RV64I-MEDIUM-NEXT:    #NO_APP
1589; RV64I-MEDIUM-NEXT:    ret
1590;
1591; RV64I-LARGE-LABEL: constraint_o_with_extern_weak_global_3:
1592; RV64I-LARGE:       # %bb.0:
1593; RV64I-LARGE-NEXT:  .Lpcrel_hi18:
1594; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI24_0)
1595; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi18)(a0)
1596; RV64I-LARGE-NEXT:    lui a1, 2
1597; RV64I-LARGE-NEXT:    addiw a1, a1, -192
1598; RV64I-LARGE-NEXT:    add a0, a0, a1
1599; RV64I-LARGE-NEXT:    #APP
1600; RV64I-LARGE-NEXT:    sw zero, 0(a0)
1601; RV64I-LARGE-NEXT:    #NO_APP
1602; RV64I-LARGE-NEXT:    ret
1603  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @ewg, i32 0, i32 2000))
1604  ret void
1605}
1606
1607define void @constraint_o_with_multi_asm() nounwind {
1608; RV32I-LABEL: constraint_o_with_multi_asm:
1609; RV32I:       # %bb.0:
1610; RV32I-NEXT:    lui a0, %hi(eg)
1611; RV32I-NEXT:    #APP
1612; RV32I-NEXT:    sw zero, %lo(eg)(a0)
1613; RV32I-NEXT:    #NO_APP
1614; RV32I-NEXT:    #APP
1615; RV32I-NEXT:    sw zero, %lo(eg)(a0)
1616; RV32I-NEXT:    #NO_APP
1617; RV32I-NEXT:    ret
1618;
1619; RV64I-LABEL: constraint_o_with_multi_asm:
1620; RV64I:       # %bb.0:
1621; RV64I-NEXT:    lui a0, %hi(eg)
1622; RV64I-NEXT:    #APP
1623; RV64I-NEXT:    sw zero, %lo(eg)(a0)
1624; RV64I-NEXT:    #NO_APP
1625; RV64I-NEXT:    #APP
1626; RV64I-NEXT:    sw zero, %lo(eg)(a0)
1627; RV64I-NEXT:    #NO_APP
1628; RV64I-NEXT:    ret
1629;
1630; RV32I-MEDIUM-LABEL: constraint_o_with_multi_asm:
1631; RV32I-MEDIUM:       # %bb.0:
1632; RV32I-MEDIUM-NEXT:  .Lpcrel_hi19:
1633; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
1634; RV32I-MEDIUM-NEXT:    #APP
1635; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
1636; RV32I-MEDIUM-NEXT:    #NO_APP
1637; RV32I-MEDIUM-NEXT:    #APP
1638; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
1639; RV32I-MEDIUM-NEXT:    #NO_APP
1640; RV32I-MEDIUM-NEXT:    ret
1641;
1642; RV64I-MEDIUM-LABEL: constraint_o_with_multi_asm:
1643; RV64I-MEDIUM:       # %bb.0:
1644; RV64I-MEDIUM-NEXT:  .Lpcrel_hi19:
1645; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
1646; RV64I-MEDIUM-NEXT:    #APP
1647; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
1648; RV64I-MEDIUM-NEXT:    #NO_APP
1649; RV64I-MEDIUM-NEXT:    #APP
1650; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
1651; RV64I-MEDIUM-NEXT:    #NO_APP
1652; RV64I-MEDIUM-NEXT:    ret
1653;
1654; RV64I-LARGE-LABEL: constraint_o_with_multi_asm:
1655; RV64I-LARGE:       # %bb.0:
1656; RV64I-LARGE-NEXT:  .Lpcrel_hi19:
1657; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI25_0)
1658; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi19)(a0)
1659; RV64I-LARGE-NEXT:    #APP
1660; RV64I-LARGE-NEXT:    sw zero, 0(a0)
1661; RV64I-LARGE-NEXT:    #NO_APP
1662; RV64I-LARGE-NEXT:    #APP
1663; RV64I-LARGE-NEXT:    sw zero, 0(a0)
1664; RV64I-LARGE-NEXT:    #NO_APP
1665; RV64I-LARGE-NEXT:    ret
1666  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
1667  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
1668  ret void
1669}
1670
1671define i32 @constraint_o_with_callbr_multi_operands(i32 %a) {
1672; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1673; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
1674; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
1675; RV32I-NO-INTEGRATED-NEXT:    #APP
1676; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB26_2
1677; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
1678; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
1679; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
1680; RV32I-NO-INTEGRATED-NEXT:    ret
1681; RV32I-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1682; RV32I-NO-INTEGRATED-NEXT:    # %fail
1683; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1684; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
1685; RV32I-NO-INTEGRATED-NEXT:    ret
1686;
1687; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1688; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
1689; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
1690; RV64I-NO-INTEGRATED-NEXT:    #APP
1691; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB26_2
1692; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
1693; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
1694; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
1695; RV64I-NO-INTEGRATED-NEXT:    ret
1696; RV64I-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1697; RV64I-NO-INTEGRATED-NEXT:    # %fail
1698; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1699; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
1700; RV64I-NO-INTEGRATED-NEXT:    ret
1701;
1702; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1703; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
1704; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi20:
1705; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1706; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1707; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); beqz a0, .LBB26_2
1708; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1709; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
1710; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
1711; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1712; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1713; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
1714; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1715; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
1716; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1717;
1718; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1719; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
1720; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi20:
1721; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1722; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1723; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); beqz a0, .LBB26_2
1724; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1725; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
1726; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
1727; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1728; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1729; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
1730; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1731; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
1732; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1733;
1734; RV64I-LARGE-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1735; RV64I-LARGE-NO-INTEGRATED:       # %bb.0: # %entry
1736; RV64I-LARGE-NO-INTEGRATED-NEXT:  .Lpcrel_hi20:
1737; RV64I-LARGE-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI26_0)
1738; RV64I-LARGE-NO-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi20)(a1)
1739; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
1740; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB26_2
1741; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
1742; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
1743; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 0
1744; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
1745; RV64I-LARGE-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1746; RV64I-LARGE-NO-INTEGRATED-NEXT:    # %fail
1747; RV64I-LARGE-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1748; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 1
1749; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
1750;
1751; RV32I-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1752; RV32I-INTEGRATED:       # %bb.0: # %entry
1753; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
1754; RV32I-INTEGRATED-NEXT:    #APP
1755; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1756; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1757; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB26_2
1758; RV32I-INTEGRATED-NEXT:    #NO_APP
1759; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal
1760; RV32I-INTEGRATED-NEXT:    li a0, 0
1761; RV32I-INTEGRATED-NEXT:    ret
1762; RV32I-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1763; RV32I-INTEGRATED-NEXT:    # %fail
1764; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
1765; RV32I-INTEGRATED-NEXT:    li a0, 1
1766; RV32I-INTEGRATED-NEXT:    ret
1767;
1768; RV64I-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1769; RV64I-INTEGRATED:       # %bb.0: # %entry
1770; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
1771; RV64I-INTEGRATED-NEXT:    #APP
1772; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1773; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1774; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB26_2
1775; RV64I-INTEGRATED-NEXT:    #NO_APP
1776; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal
1777; RV64I-INTEGRATED-NEXT:    li a0, 0
1778; RV64I-INTEGRATED-NEXT:    ret
1779; RV64I-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1780; RV64I-INTEGRATED-NEXT:    # %fail
1781; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
1782; RV64I-INTEGRATED-NEXT:    li a0, 1
1783; RV64I-INTEGRATED-NEXT:    ret
1784;
1785; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1786; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
1787; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi20:
1788; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1789; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
1790; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
1791; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
1792; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB26_2
1793; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
1794; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
1795; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
1796; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
1797; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1798; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
1799; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
1800; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
1801; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
1802;
1803; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1804; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
1805; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi20:
1806; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1807; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
1808; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
1809; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
1810; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB26_2
1811; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
1812; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
1813; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
1814; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
1815; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1816; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
1817; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
1818; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
1819; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
1820;
1821; RV64I-LARGE-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
1822; RV64I-LARGE-INTEGRATED:       # %bb.0: # %entry
1823; RV64I-LARGE-INTEGRATED-NEXT:  .Lpcrel_hi20:
1824; RV64I-LARGE-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI26_0)
1825; RV64I-LARGE-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi20)(a1)
1826; RV64I-LARGE-INTEGRATED-NEXT:    #APP
1827; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
1828; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
1829; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB26_2
1830; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
1831; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.1: # %normal
1832; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 0
1833; RV64I-LARGE-INTEGRATED-NEXT:    ret
1834; RV64I-LARGE-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
1835; RV64I-LARGE-INTEGRATED-NEXT:    # %fail
1836; RV64I-LARGE-INTEGRATED-NEXT:    # Label of block must be emitted
1837; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 1
1838; RV64I-LARGE-INTEGRATED-NEXT:    ret
1839entry:
1840  callbr void asm "sw zero, $0; sw zero, $1; beqz $2, $3", "=*m,=*m,r,!i"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg, i32 %a) to label %normal [label %fail]
1841
1842normal:
1843  ret i32 0
1844
1845fail:
1846  ret i32 1
1847}
1848
1849define i32 @constraint_o_with_multi_callbr_asm(i32 %a) {
1850; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1851; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
1852; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
1853; RV32I-NO-INTEGRATED-NEXT:    #APP
1854; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
1855; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
1856; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1857; RV32I-NO-INTEGRATED-NEXT:    #APP
1858; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
1859; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
1860; RV32I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1861; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
1862; RV32I-NO-INTEGRATED-NEXT:    ret
1863; RV32I-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
1864; RV32I-NO-INTEGRATED-NEXT:    # %fail
1865; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1866; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
1867; RV32I-NO-INTEGRATED-NEXT:    ret
1868;
1869; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1870; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
1871; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
1872; RV64I-NO-INTEGRATED-NEXT:    #APP
1873; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
1874; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
1875; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1876; RV64I-NO-INTEGRATED-NEXT:    #APP
1877; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
1878; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
1879; RV64I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1880; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
1881; RV64I-NO-INTEGRATED-NEXT:    ret
1882; RV64I-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
1883; RV64I-NO-INTEGRATED-NEXT:    # %fail
1884; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1885; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
1886; RV64I-NO-INTEGRATED-NEXT:    ret
1887;
1888; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1889; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
1890; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi21:
1891; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1892; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1893; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
1894; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1895; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1896; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1897; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
1898; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1899; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1900; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
1901; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1902; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
1903; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
1904; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1905; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
1906; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1907;
1908; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1909; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
1910; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi21:
1911; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1912; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1913; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
1914; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1915; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1916; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
1917; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
1918; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
1919; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1920; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
1921; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1922; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
1923; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
1924; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1925; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
1926; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
1927;
1928; RV64I-LARGE-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1929; RV64I-LARGE-NO-INTEGRATED:       # %bb.0: # %entry
1930; RV64I-LARGE-NO-INTEGRATED-NEXT:  .Lpcrel_hi21:
1931; RV64I-LARGE-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI27_0)
1932; RV64I-LARGE-NO-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi21)(a1)
1933; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
1934; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB27_3
1935; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
1936; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
1937; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
1938; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB27_3
1939; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
1940; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
1941; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 0
1942; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
1943; RV64I-LARGE-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
1944; RV64I-LARGE-NO-INTEGRATED-NEXT:    # %fail
1945; RV64I-LARGE-NO-INTEGRATED-NEXT:    # Label of block must be emitted
1946; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 1
1947; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
1948;
1949; RV32I-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1950; RV32I-INTEGRATED:       # %bb.0: # %entry
1951; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
1952; RV32I-INTEGRATED-NEXT:    #APP
1953; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1954; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
1955; RV32I-INTEGRATED-NEXT:    #NO_APP
1956; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal0
1957; RV32I-INTEGRATED-NEXT:    #APP
1958; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1959; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
1960; RV32I-INTEGRATED-NEXT:    #NO_APP
1961; RV32I-INTEGRATED-NEXT:  # %bb.2: # %normal1
1962; RV32I-INTEGRATED-NEXT:    li a0, 0
1963; RV32I-INTEGRATED-NEXT:    ret
1964; RV32I-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
1965; RV32I-INTEGRATED-NEXT:    # %fail
1966; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
1967; RV32I-INTEGRATED-NEXT:    li a0, 1
1968; RV32I-INTEGRATED-NEXT:    ret
1969;
1970; RV64I-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1971; RV64I-INTEGRATED:       # %bb.0: # %entry
1972; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
1973; RV64I-INTEGRATED-NEXT:    #APP
1974; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1975; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
1976; RV64I-INTEGRATED-NEXT:    #NO_APP
1977; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal0
1978; RV64I-INTEGRATED-NEXT:    #APP
1979; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
1980; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
1981; RV64I-INTEGRATED-NEXT:    #NO_APP
1982; RV64I-INTEGRATED-NEXT:  # %bb.2: # %normal1
1983; RV64I-INTEGRATED-NEXT:    li a0, 0
1984; RV64I-INTEGRATED-NEXT:    ret
1985; RV64I-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
1986; RV64I-INTEGRATED-NEXT:    # %fail
1987; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
1988; RV64I-INTEGRATED-NEXT:    li a0, 1
1989; RV64I-INTEGRATED-NEXT:    ret
1990;
1991; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
1992; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
1993; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi21:
1994; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
1995; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
1996; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
1997; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
1998; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
1999; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
2000; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
2001; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
2002; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
2003; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
2004; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
2005; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
2006; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
2007; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
2008; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
2009; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
2010; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
2011; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
2012;
2013; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
2014; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
2015; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi21:
2016; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
2017; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
2018; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
2019; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
2020; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
2021; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
2022; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
2023; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
2024; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
2025; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
2026; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
2027; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
2028; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
2029; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
2030; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
2031; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
2032; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
2033; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
2034;
2035; RV64I-LARGE-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
2036; RV64I-LARGE-INTEGRATED:       # %bb.0: # %entry
2037; RV64I-LARGE-INTEGRATED-NEXT:  .Lpcrel_hi21:
2038; RV64I-LARGE-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI27_0)
2039; RV64I-LARGE-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi21)(a1)
2040; RV64I-LARGE-INTEGRATED-NEXT:    #APP
2041; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
2042; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB27_3
2043; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
2044; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.1: # %normal0
2045; RV64I-LARGE-INTEGRATED-NEXT:    #APP
2046; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
2047; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB27_3
2048; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
2049; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.2: # %normal1
2050; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 0
2051; RV64I-LARGE-INTEGRATED-NEXT:    ret
2052; RV64I-LARGE-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
2053; RV64I-LARGE-INTEGRATED-NEXT:    # %fail
2054; RV64I-LARGE-INTEGRATED-NEXT:    # Label of block must be emitted
2055; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 1
2056; RV64I-LARGE-INTEGRATED-NEXT:    ret
2057entry:
2058  callbr void asm "sw zero, $0; beqz $1, $2", "=*o,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal0 [label %fail]
2059
2060normal0:
2061  callbr void asm "sw zero, $0; beqz $1, $2", "=*o,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal1 [label %fail]
2062
2063normal1:
2064  ret i32 0
2065
2066fail:
2067  ret i32 1
2068}
2069
2070define void @constraint_o_with_local_1() nounwind {
2071; RV32I-LABEL: constraint_o_with_local_1:
2072; RV32I:       # %bb.0: # %entry
2073; RV32I-NEXT:  .Ltmp3: # Block address taken
2074; RV32I-NEXT:  # %bb.1: # %label
2075; RV32I-NEXT:    lui a0, %hi(.Ltmp3)
2076; RV32I-NEXT:    #APP
2077; RV32I-NEXT:    lw zero, %lo(.Ltmp3)(a0)
2078; RV32I-NEXT:    #NO_APP
2079; RV32I-NEXT:    ret
2080;
2081; RV64I-LABEL: constraint_o_with_local_1:
2082; RV64I:       # %bb.0: # %entry
2083; RV64I-NEXT:  .Ltmp3: # Block address taken
2084; RV64I-NEXT:  # %bb.1: # %label
2085; RV64I-NEXT:    lui a0, %hi(.Ltmp3)
2086; RV64I-NEXT:    #APP
2087; RV64I-NEXT:    lw zero, %lo(.Ltmp3)(a0)
2088; RV64I-NEXT:    #NO_APP
2089; RV64I-NEXT:    ret
2090;
2091; RV32I-MEDIUM-LABEL: constraint_o_with_local_1:
2092; RV32I-MEDIUM:       # %bb.0: # %entry
2093; RV32I-MEDIUM-NEXT:  .Ltmp3: # Block address taken
2094; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
2095; RV32I-MEDIUM-NEXT:  .Lpcrel_hi22:
2096; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
2097; RV32I-MEDIUM-NEXT:    #APP
2098; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
2099; RV32I-MEDIUM-NEXT:    #NO_APP
2100; RV32I-MEDIUM-NEXT:    ret
2101;
2102; RV64I-MEDIUM-LABEL: constraint_o_with_local_1:
2103; RV64I-MEDIUM:       # %bb.0: # %entry
2104; RV64I-MEDIUM-NEXT:  .Ltmp3: # Block address taken
2105; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
2106; RV64I-MEDIUM-NEXT:  .Lpcrel_hi22:
2107; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
2108; RV64I-MEDIUM-NEXT:    #APP
2109; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
2110; RV64I-MEDIUM-NEXT:    #NO_APP
2111; RV64I-MEDIUM-NEXT:    ret
2112;
2113; RV64I-LARGE-LABEL: constraint_o_with_local_1:
2114; RV64I-LARGE:       # %bb.0: # %entry
2115; RV64I-LARGE-NEXT:  .Ltmp3: # Block address taken
2116; RV64I-LARGE-NEXT:  # %bb.1: # %label
2117; RV64I-LARGE-NEXT:  .Lpcrel_hi22:
2118; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
2119; RV64I-LARGE-NEXT:    #APP
2120; RV64I-LARGE-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
2121; RV64I-LARGE-NEXT:    #NO_APP
2122; RV64I-LARGE-NEXT:    ret
2123entry:
2124  br label %label
2125
2126label:
2127  tail call void asm sideeffect "lw zero, $0", "*o"(ptr elementtype(ptr) blockaddress(@constraint_o_with_local_1, %label))
2128  ret void
2129}
2130
2131define void @constraint_o_with_local_2() nounwind {
2132; RV32I-LABEL: constraint_o_with_local_2:
2133; RV32I:       # %bb.0: # %entry
2134; RV32I-NEXT:  .Ltmp4: # Block address taken
2135; RV32I-NEXT:  # %bb.1: # %label
2136; RV32I-NEXT:    lui a0, %hi(.Ltmp4+4)
2137; RV32I-NEXT:    #APP
2138; RV32I-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
2139; RV32I-NEXT:    #NO_APP
2140; RV32I-NEXT:    ret
2141;
2142; RV64I-LABEL: constraint_o_with_local_2:
2143; RV64I:       # %bb.0: # %entry
2144; RV64I-NEXT:  .Ltmp4: # Block address taken
2145; RV64I-NEXT:  # %bb.1: # %label
2146; RV64I-NEXT:    lui a0, %hi(.Ltmp4+4)
2147; RV64I-NEXT:    #APP
2148; RV64I-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
2149; RV64I-NEXT:    #NO_APP
2150; RV64I-NEXT:    ret
2151;
2152; RV32I-MEDIUM-LABEL: constraint_o_with_local_2:
2153; RV32I-MEDIUM:       # %bb.0: # %entry
2154; RV32I-MEDIUM-NEXT:  .Ltmp4: # Block address taken
2155; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
2156; RV32I-MEDIUM-NEXT:  .Lpcrel_hi23:
2157; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
2158; RV32I-MEDIUM-NEXT:    #APP
2159; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
2160; RV32I-MEDIUM-NEXT:    #NO_APP
2161; RV32I-MEDIUM-NEXT:    ret
2162;
2163; RV64I-MEDIUM-LABEL: constraint_o_with_local_2:
2164; RV64I-MEDIUM:       # %bb.0: # %entry
2165; RV64I-MEDIUM-NEXT:  .Ltmp4: # Block address taken
2166; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
2167; RV64I-MEDIUM-NEXT:  .Lpcrel_hi23:
2168; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
2169; RV64I-MEDIUM-NEXT:    #APP
2170; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
2171; RV64I-MEDIUM-NEXT:    #NO_APP
2172; RV64I-MEDIUM-NEXT:    ret
2173;
2174; RV64I-LARGE-LABEL: constraint_o_with_local_2:
2175; RV64I-LARGE:       # %bb.0: # %entry
2176; RV64I-LARGE-NEXT:  .Ltmp4: # Block address taken
2177; RV64I-LARGE-NEXT:  # %bb.1: # %label
2178; RV64I-LARGE-NEXT:  .Lpcrel_hi23:
2179; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
2180; RV64I-LARGE-NEXT:    #APP
2181; RV64I-LARGE-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
2182; RV64I-LARGE-NEXT:    #NO_APP
2183; RV64I-LARGE-NEXT:    ret
2184entry:
2185  br label %label
2186
2187label:
2188  call void asm "lw zero, $0", "*o"(ptr elementtype(i32) getelementptr (i8, ptr blockaddress(@constraint_o_with_local_2, %label), i32 4))
2189  ret void
2190}
2191
2192define void @constraint_o_with_local_3() nounwind {
2193; RV32I-LABEL: constraint_o_with_local_3:
2194; RV32I:       # %bb.0: # %entry
2195; RV32I-NEXT:  .Ltmp5: # Block address taken
2196; RV32I-NEXT:  # %bb.1: # %label
2197; RV32I-NEXT:    lui a0, %hi(.Ltmp5+2000)
2198; RV32I-NEXT:    #APP
2199; RV32I-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
2200; RV32I-NEXT:    #NO_APP
2201; RV32I-NEXT:    ret
2202;
2203; RV64I-LABEL: constraint_o_with_local_3:
2204; RV64I:       # %bb.0: # %entry
2205; RV64I-NEXT:  .Ltmp5: # Block address taken
2206; RV64I-NEXT:  # %bb.1: # %label
2207; RV64I-NEXT:    lui a0, %hi(.Ltmp5+2000)
2208; RV64I-NEXT:    #APP
2209; RV64I-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
2210; RV64I-NEXT:    #NO_APP
2211; RV64I-NEXT:    ret
2212;
2213; RV32I-MEDIUM-LABEL: constraint_o_with_local_3:
2214; RV32I-MEDIUM:       # %bb.0: # %entry
2215; RV32I-MEDIUM-NEXT:  .Ltmp5: # Block address taken
2216; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
2217; RV32I-MEDIUM-NEXT:  .Lpcrel_hi24:
2218; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
2219; RV32I-MEDIUM-NEXT:    #APP
2220; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
2221; RV32I-MEDIUM-NEXT:    #NO_APP
2222; RV32I-MEDIUM-NEXT:    ret
2223;
2224; RV64I-MEDIUM-LABEL: constraint_o_with_local_3:
2225; RV64I-MEDIUM:       # %bb.0: # %entry
2226; RV64I-MEDIUM-NEXT:  .Ltmp5: # Block address taken
2227; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
2228; RV64I-MEDIUM-NEXT:  .Lpcrel_hi24:
2229; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
2230; RV64I-MEDIUM-NEXT:    #APP
2231; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
2232; RV64I-MEDIUM-NEXT:    #NO_APP
2233; RV64I-MEDIUM-NEXT:    ret
2234;
2235; RV64I-LARGE-LABEL: constraint_o_with_local_3:
2236; RV64I-LARGE:       # %bb.0: # %entry
2237; RV64I-LARGE-NEXT:  .Ltmp5: # Block address taken
2238; RV64I-LARGE-NEXT:  # %bb.1: # %label
2239; RV64I-LARGE-NEXT:  .Lpcrel_hi24:
2240; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
2241; RV64I-LARGE-NEXT:    #APP
2242; RV64I-LARGE-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
2243; RV64I-LARGE-NEXT:    #NO_APP
2244; RV64I-LARGE-NEXT:    ret
2245entry:
2246  br label %label
2247
2248label:
2249  call void asm "lw zero, $0", "*o"(ptr elementtype(i32) getelementptr (i8, ptr blockaddress(@constraint_o_with_local_3, %label), i32 2000))
2250  ret void
2251}
2252
2253define void @constraint_A(ptr %a) nounwind {
2254; RV32I-LABEL: constraint_A:
2255; RV32I:       # %bb.0:
2256; RV32I-NEXT:    #APP
2257; RV32I-NEXT:    sb s0, 0(a0)
2258; RV32I-NEXT:    #NO_APP
2259; RV32I-NEXT:    #APP
2260; RV32I-NEXT:    lb s1, 0(a0)
2261; RV32I-NEXT:    #NO_APP
2262; RV32I-NEXT:    ret
2263;
2264; RV64I-LABEL: constraint_A:
2265; RV64I:       # %bb.0:
2266; RV64I-NEXT:    #APP
2267; RV64I-NEXT:    sb s0, 0(a0)
2268; RV64I-NEXT:    #NO_APP
2269; RV64I-NEXT:    #APP
2270; RV64I-NEXT:    lb s1, 0(a0)
2271; RV64I-NEXT:    #NO_APP
2272; RV64I-NEXT:    ret
2273;
2274; RV32I-MEDIUM-LABEL: constraint_A:
2275; RV32I-MEDIUM:       # %bb.0:
2276; RV32I-MEDIUM-NEXT:    #APP
2277; RV32I-MEDIUM-NEXT:    sb s0, 0(a0)
2278; RV32I-MEDIUM-NEXT:    #NO_APP
2279; RV32I-MEDIUM-NEXT:    #APP
2280; RV32I-MEDIUM-NEXT:    lb s1, 0(a0)
2281; RV32I-MEDIUM-NEXT:    #NO_APP
2282; RV32I-MEDIUM-NEXT:    ret
2283;
2284; RV64I-MEDIUM-LABEL: constraint_A:
2285; RV64I-MEDIUM:       # %bb.0:
2286; RV64I-MEDIUM-NEXT:    #APP
2287; RV64I-MEDIUM-NEXT:    sb s0, 0(a0)
2288; RV64I-MEDIUM-NEXT:    #NO_APP
2289; RV64I-MEDIUM-NEXT:    #APP
2290; RV64I-MEDIUM-NEXT:    lb s1, 0(a0)
2291; RV64I-MEDIUM-NEXT:    #NO_APP
2292; RV64I-MEDIUM-NEXT:    ret
2293;
2294; RV64I-LARGE-LABEL: constraint_A:
2295; RV64I-LARGE:       # %bb.0:
2296; RV64I-LARGE-NEXT:    #APP
2297; RV64I-LARGE-NEXT:    sb s0, 0(a0)
2298; RV64I-LARGE-NEXT:    #NO_APP
2299; RV64I-LARGE-NEXT:    #APP
2300; RV64I-LARGE-NEXT:    lb s1, 0(a0)
2301; RV64I-LARGE-NEXT:    #NO_APP
2302; RV64I-LARGE-NEXT:    ret
2303  tail call void asm sideeffect "sb s0, $0", "*A"(ptr elementtype(i8) %a)
2304  tail call void asm sideeffect "lb s1, $0", "*A"(ptr elementtype(i8) %a)
2305  ret void
2306}
2307
2308define i32 @constraint_A_with_offset(ptr %a) nounwind {
2309; RV32I-LABEL: constraint_A_with_offset:
2310; RV32I:       # %bb.0:
2311; RV32I-NEXT:    addi a0, a0, 4
2312; RV32I-NEXT:    #APP
2313; RV32I-NEXT:    lw a0, 0(a0)
2314; RV32I-NEXT:    #NO_APP
2315; RV32I-NEXT:    ret
2316;
2317; RV64I-LABEL: constraint_A_with_offset:
2318; RV64I:       # %bb.0:
2319; RV64I-NEXT:    addi a0, a0, 4
2320; RV64I-NEXT:    #APP
2321; RV64I-NEXT:    lw a0, 0(a0)
2322; RV64I-NEXT:    #NO_APP
2323; RV64I-NEXT:    ret
2324;
2325; RV32I-MEDIUM-LABEL: constraint_A_with_offset:
2326; RV32I-MEDIUM:       # %bb.0:
2327; RV32I-MEDIUM-NEXT:    addi a0, a0, 4
2328; RV32I-MEDIUM-NEXT:    #APP
2329; RV32I-MEDIUM-NEXT:    lw a0, 0(a0)
2330; RV32I-MEDIUM-NEXT:    #NO_APP
2331; RV32I-MEDIUM-NEXT:    ret
2332;
2333; RV64I-MEDIUM-LABEL: constraint_A_with_offset:
2334; RV64I-MEDIUM:       # %bb.0:
2335; RV64I-MEDIUM-NEXT:    addi a0, a0, 4
2336; RV64I-MEDIUM-NEXT:    #APP
2337; RV64I-MEDIUM-NEXT:    lw a0, 0(a0)
2338; RV64I-MEDIUM-NEXT:    #NO_APP
2339; RV64I-MEDIUM-NEXT:    ret
2340;
2341; RV64I-LARGE-LABEL: constraint_A_with_offset:
2342; RV64I-LARGE:       # %bb.0:
2343; RV64I-LARGE-NEXT:    addi a0, a0, 4
2344; RV64I-LARGE-NEXT:    #APP
2345; RV64I-LARGE-NEXT:    lw a0, 0(a0)
2346; RV64I-LARGE-NEXT:    #NO_APP
2347; RV64I-LARGE-NEXT:    ret
2348  %1 = getelementptr i32, ptr %a, i32 1
2349  %2 = tail call i32 asm "lw $0, $1", "=r,*A"(ptr elementtype(i32) %1)
2350  ret i32 %2
2351}
2352
2353define void @constraint_A_with_global_1() nounwind {
2354; RV32I-LABEL: constraint_A_with_global_1:
2355; RV32I:       # %bb.0:
2356; RV32I-NEXT:    lui a0, %hi(eg)
2357; RV32I-NEXT:    addi a0, a0, %lo(eg)
2358; RV32I-NEXT:    #APP
2359; RV32I-NEXT:    sw zero, 0(a0)
2360; RV32I-NEXT:    #NO_APP
2361; RV32I-NEXT:    ret
2362;
2363; RV64I-LABEL: constraint_A_with_global_1:
2364; RV64I:       # %bb.0:
2365; RV64I-NEXT:    lui a0, %hi(eg)
2366; RV64I-NEXT:    addi a0, a0, %lo(eg)
2367; RV64I-NEXT:    #APP
2368; RV64I-NEXT:    sw zero, 0(a0)
2369; RV64I-NEXT:    #NO_APP
2370; RV64I-NEXT:    ret
2371;
2372; RV32I-MEDIUM-LABEL: constraint_A_with_global_1:
2373; RV32I-MEDIUM:       # %bb.0:
2374; RV32I-MEDIUM-NEXT:  .Lpcrel_hi25:
2375; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
2376; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi25)
2377; RV32I-MEDIUM-NEXT:    #APP
2378; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2379; RV32I-MEDIUM-NEXT:    #NO_APP
2380; RV32I-MEDIUM-NEXT:    ret
2381;
2382; RV64I-MEDIUM-LABEL: constraint_A_with_global_1:
2383; RV64I-MEDIUM:       # %bb.0:
2384; RV64I-MEDIUM-NEXT:  .Lpcrel_hi25:
2385; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
2386; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi25)
2387; RV64I-MEDIUM-NEXT:    #APP
2388; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2389; RV64I-MEDIUM-NEXT:    #NO_APP
2390; RV64I-MEDIUM-NEXT:    ret
2391;
2392; RV64I-LARGE-LABEL: constraint_A_with_global_1:
2393; RV64I-LARGE:       # %bb.0:
2394; RV64I-LARGE-NEXT:  .Lpcrel_hi25:
2395; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI33_0)
2396; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi25)(a0)
2397; RV64I-LARGE-NEXT:    #APP
2398; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2399; RV64I-LARGE-NEXT:    #NO_APP
2400; RV64I-LARGE-NEXT:    ret
2401  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) @eg)
2402  ret void
2403}
2404
2405define void @constraint_A_with_global_2() nounwind {
2406; RV32I-LABEL: constraint_A_with_global_2:
2407; RV32I:       # %bb.0:
2408; RV32I-NEXT:    lui a0, %hi(eg+4)
2409; RV32I-NEXT:    addi a0, a0, %lo(eg+4)
2410; RV32I-NEXT:    #APP
2411; RV32I-NEXT:    sw zero, 0(a0)
2412; RV32I-NEXT:    #NO_APP
2413; RV32I-NEXT:    ret
2414;
2415; RV64I-LABEL: constraint_A_with_global_2:
2416; RV64I:       # %bb.0:
2417; RV64I-NEXT:    lui a0, %hi(eg+4)
2418; RV64I-NEXT:    addi a0, a0, %lo(eg+4)
2419; RV64I-NEXT:    #APP
2420; RV64I-NEXT:    sw zero, 0(a0)
2421; RV64I-NEXT:    #NO_APP
2422; RV64I-NEXT:    ret
2423;
2424; RV32I-MEDIUM-LABEL: constraint_A_with_global_2:
2425; RV32I-MEDIUM:       # %bb.0:
2426; RV32I-MEDIUM-NEXT:  .Lpcrel_hi26:
2427; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
2428; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi26)
2429; RV32I-MEDIUM-NEXT:    #APP
2430; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2431; RV32I-MEDIUM-NEXT:    #NO_APP
2432; RV32I-MEDIUM-NEXT:    ret
2433;
2434; RV64I-MEDIUM-LABEL: constraint_A_with_global_2:
2435; RV64I-MEDIUM:       # %bb.0:
2436; RV64I-MEDIUM-NEXT:  .Lpcrel_hi26:
2437; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
2438; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi26)
2439; RV64I-MEDIUM-NEXT:    #APP
2440; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2441; RV64I-MEDIUM-NEXT:    #NO_APP
2442; RV64I-MEDIUM-NEXT:    ret
2443;
2444; RV64I-LARGE-LABEL: constraint_A_with_global_2:
2445; RV64I-LARGE:       # %bb.0:
2446; RV64I-LARGE-NEXT:  .Lpcrel_hi26:
2447; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI34_0)
2448; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi26)(a0)
2449; RV64I-LARGE-NEXT:    addi a0, a0, 4
2450; RV64I-LARGE-NEXT:    #APP
2451; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2452; RV64I-LARGE-NEXT:    #NO_APP
2453; RV64I-LARGE-NEXT:    ret
2454  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 1))
2455  ret void
2456}
2457
2458define void @constraint_A_with_global_3() nounwind {
2459; RV32I-LABEL: constraint_A_with_global_3:
2460; RV32I:       # %bb.0:
2461; RV32I-NEXT:    lui a0, %hi(eg+8000)
2462; RV32I-NEXT:    addi a0, a0, %lo(eg+8000)
2463; RV32I-NEXT:    #APP
2464; RV32I-NEXT:    sw zero, 0(a0)
2465; RV32I-NEXT:    #NO_APP
2466; RV32I-NEXT:    ret
2467;
2468; RV64I-LABEL: constraint_A_with_global_3:
2469; RV64I:       # %bb.0:
2470; RV64I-NEXT:    lui a0, %hi(eg+8000)
2471; RV64I-NEXT:    addi a0, a0, %lo(eg+8000)
2472; RV64I-NEXT:    #APP
2473; RV64I-NEXT:    sw zero, 0(a0)
2474; RV64I-NEXT:    #NO_APP
2475; RV64I-NEXT:    ret
2476;
2477; RV32I-MEDIUM-LABEL: constraint_A_with_global_3:
2478; RV32I-MEDIUM:       # %bb.0:
2479; RV32I-MEDIUM-NEXT:  .Lpcrel_hi27:
2480; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
2481; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi27)
2482; RV32I-MEDIUM-NEXT:    #APP
2483; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2484; RV32I-MEDIUM-NEXT:    #NO_APP
2485; RV32I-MEDIUM-NEXT:    ret
2486;
2487; RV64I-MEDIUM-LABEL: constraint_A_with_global_3:
2488; RV64I-MEDIUM:       # %bb.0:
2489; RV64I-MEDIUM-NEXT:  .Lpcrel_hi27:
2490; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
2491; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi27)
2492; RV64I-MEDIUM-NEXT:    #APP
2493; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2494; RV64I-MEDIUM-NEXT:    #NO_APP
2495; RV64I-MEDIUM-NEXT:    ret
2496;
2497; RV64I-LARGE-LABEL: constraint_A_with_global_3:
2498; RV64I-LARGE:       # %bb.0:
2499; RV64I-LARGE-NEXT:  .Lpcrel_hi27:
2500; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI35_0)
2501; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi27)(a0)
2502; RV64I-LARGE-NEXT:    lui a1, 2
2503; RV64I-LARGE-NEXT:    addiw a1, a1, -192
2504; RV64I-LARGE-NEXT:    add a0, a0, a1
2505; RV64I-LARGE-NEXT:    #APP
2506; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2507; RV64I-LARGE-NEXT:    #NO_APP
2508; RV64I-LARGE-NEXT:    ret
2509  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 2000))
2510  ret void
2511}
2512
2513define void @constraint_A_with_extern_weak_global_1() nounwind {
2514; RV32I-LABEL: constraint_A_with_extern_weak_global_1:
2515; RV32I:       # %bb.0:
2516; RV32I-NEXT:    lui a0, %hi(ewg)
2517; RV32I-NEXT:    addi a0, a0, %lo(ewg)
2518; RV32I-NEXT:    #APP
2519; RV32I-NEXT:    sw zero, 0(a0)
2520; RV32I-NEXT:    #NO_APP
2521; RV32I-NEXT:    ret
2522;
2523; RV64I-LABEL: constraint_A_with_extern_weak_global_1:
2524; RV64I:       # %bb.0:
2525; RV64I-NEXT:    lui a0, %hi(ewg)
2526; RV64I-NEXT:    addi a0, a0, %lo(ewg)
2527; RV64I-NEXT:    #APP
2528; RV64I-NEXT:    sw zero, 0(a0)
2529; RV64I-NEXT:    #NO_APP
2530; RV64I-NEXT:    ret
2531;
2532; RV32I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_1:
2533; RV32I-MEDIUM:       # %bb.0:
2534; RV32I-MEDIUM-NEXT:  .Lpcrel_hi28:
2535; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
2536; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi28)(a0)
2537; RV32I-MEDIUM-NEXT:    #APP
2538; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2539; RV32I-MEDIUM-NEXT:    #NO_APP
2540; RV32I-MEDIUM-NEXT:    ret
2541;
2542; RV64I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_1:
2543; RV64I-MEDIUM:       # %bb.0:
2544; RV64I-MEDIUM-NEXT:  .Lpcrel_hi28:
2545; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
2546; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi28)(a0)
2547; RV64I-MEDIUM-NEXT:    #APP
2548; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2549; RV64I-MEDIUM-NEXT:    #NO_APP
2550; RV64I-MEDIUM-NEXT:    ret
2551;
2552; RV64I-LARGE-LABEL: constraint_A_with_extern_weak_global_1:
2553; RV64I-LARGE:       # %bb.0:
2554; RV64I-LARGE-NEXT:  .Lpcrel_hi28:
2555; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI36_0)
2556; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi28)(a0)
2557; RV64I-LARGE-NEXT:    #APP
2558; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2559; RV64I-LARGE-NEXT:    #NO_APP
2560; RV64I-LARGE-NEXT:    ret
2561  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) @ewg)
2562  ret void
2563}
2564
2565define void @constraint_A_with_extern_weak_global_2() nounwind {
2566; RV32I-LABEL: constraint_A_with_extern_weak_global_2:
2567; RV32I:       # %bb.0:
2568; RV32I-NEXT:    lui a0, %hi(ewg+4)
2569; RV32I-NEXT:    addi a0, a0, %lo(ewg+4)
2570; RV32I-NEXT:    #APP
2571; RV32I-NEXT:    sw zero, 0(a0)
2572; RV32I-NEXT:    #NO_APP
2573; RV32I-NEXT:    ret
2574;
2575; RV64I-LABEL: constraint_A_with_extern_weak_global_2:
2576; RV64I:       # %bb.0:
2577; RV64I-NEXT:    lui a0, %hi(ewg+4)
2578; RV64I-NEXT:    addi a0, a0, %lo(ewg+4)
2579; RV64I-NEXT:    #APP
2580; RV64I-NEXT:    sw zero, 0(a0)
2581; RV64I-NEXT:    #NO_APP
2582; RV64I-NEXT:    ret
2583;
2584; RV32I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_2:
2585; RV32I-MEDIUM:       # %bb.0:
2586; RV32I-MEDIUM-NEXT:  .Lpcrel_hi29:
2587; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
2588; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi29)(a0)
2589; RV32I-MEDIUM-NEXT:    addi a0, a0, 4
2590; RV32I-MEDIUM-NEXT:    #APP
2591; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2592; RV32I-MEDIUM-NEXT:    #NO_APP
2593; RV32I-MEDIUM-NEXT:    ret
2594;
2595; RV64I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_2:
2596; RV64I-MEDIUM:       # %bb.0:
2597; RV64I-MEDIUM-NEXT:  .Lpcrel_hi29:
2598; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
2599; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi29)(a0)
2600; RV64I-MEDIUM-NEXT:    addi a0, a0, 4
2601; RV64I-MEDIUM-NEXT:    #APP
2602; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2603; RV64I-MEDIUM-NEXT:    #NO_APP
2604; RV64I-MEDIUM-NEXT:    ret
2605;
2606; RV64I-LARGE-LABEL: constraint_A_with_extern_weak_global_2:
2607; RV64I-LARGE:       # %bb.0:
2608; RV64I-LARGE-NEXT:  .Lpcrel_hi29:
2609; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI37_0)
2610; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi29)(a0)
2611; RV64I-LARGE-NEXT:    addi a0, a0, 4
2612; RV64I-LARGE-NEXT:    #APP
2613; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2614; RV64I-LARGE-NEXT:    #NO_APP
2615; RV64I-LARGE-NEXT:    ret
2616  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @ewg, i32 0, i32 1))
2617  ret void
2618}
2619
2620define void @constraint_A_with_extern_weak_global_3() nounwind {
2621; RV32I-LABEL: constraint_A_with_extern_weak_global_3:
2622; RV32I:       # %bb.0:
2623; RV32I-NEXT:    lui a0, %hi(ewg+8000)
2624; RV32I-NEXT:    addi a0, a0, %lo(ewg+8000)
2625; RV32I-NEXT:    #APP
2626; RV32I-NEXT:    sw zero, 0(a0)
2627; RV32I-NEXT:    #NO_APP
2628; RV32I-NEXT:    ret
2629;
2630; RV64I-LABEL: constraint_A_with_extern_weak_global_3:
2631; RV64I:       # %bb.0:
2632; RV64I-NEXT:    lui a0, %hi(ewg+8000)
2633; RV64I-NEXT:    addi a0, a0, %lo(ewg+8000)
2634; RV64I-NEXT:    #APP
2635; RV64I-NEXT:    sw zero, 0(a0)
2636; RV64I-NEXT:    #NO_APP
2637; RV64I-NEXT:    ret
2638;
2639; RV32I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_3:
2640; RV32I-MEDIUM:       # %bb.0:
2641; RV32I-MEDIUM-NEXT:  .Lpcrel_hi30:
2642; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
2643; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi30)(a0)
2644; RV32I-MEDIUM-NEXT:    lui a1, 2
2645; RV32I-MEDIUM-NEXT:    addi a1, a1, -192
2646; RV32I-MEDIUM-NEXT:    add a0, a0, a1
2647; RV32I-MEDIUM-NEXT:    #APP
2648; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2649; RV32I-MEDIUM-NEXT:    #NO_APP
2650; RV32I-MEDIUM-NEXT:    ret
2651;
2652; RV64I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_3:
2653; RV64I-MEDIUM:       # %bb.0:
2654; RV64I-MEDIUM-NEXT:  .Lpcrel_hi30:
2655; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
2656; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi30)(a0)
2657; RV64I-MEDIUM-NEXT:    lui a1, 2
2658; RV64I-MEDIUM-NEXT:    addiw a1, a1, -192
2659; RV64I-MEDIUM-NEXT:    add a0, a0, a1
2660; RV64I-MEDIUM-NEXT:    #APP
2661; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2662; RV64I-MEDIUM-NEXT:    #NO_APP
2663; RV64I-MEDIUM-NEXT:    ret
2664;
2665; RV64I-LARGE-LABEL: constraint_A_with_extern_weak_global_3:
2666; RV64I-LARGE:       # %bb.0:
2667; RV64I-LARGE-NEXT:  .Lpcrel_hi30:
2668; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI38_0)
2669; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi30)(a0)
2670; RV64I-LARGE-NEXT:    lui a1, 2
2671; RV64I-LARGE-NEXT:    addiw a1, a1, -192
2672; RV64I-LARGE-NEXT:    add a0, a0, a1
2673; RV64I-LARGE-NEXT:    #APP
2674; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2675; RV64I-LARGE-NEXT:    #NO_APP
2676; RV64I-LARGE-NEXT:    ret
2677  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @ewg, i32 0, i32 2000))
2678  ret void
2679}
2680
2681define void @constraint_A_with_multi_asm() nounwind {
2682; RV32I-LABEL: constraint_A_with_multi_asm:
2683; RV32I:       # %bb.0:
2684; RV32I-NEXT:    lui a0, %hi(eg)
2685; RV32I-NEXT:    addi a0, a0, %lo(eg)
2686; RV32I-NEXT:    #APP
2687; RV32I-NEXT:    sw zero, 0(a0)
2688; RV32I-NEXT:    #NO_APP
2689; RV32I-NEXT:    #APP
2690; RV32I-NEXT:    sw zero, 0(a0)
2691; RV32I-NEXT:    #NO_APP
2692; RV32I-NEXT:    ret
2693;
2694; RV64I-LABEL: constraint_A_with_multi_asm:
2695; RV64I:       # %bb.0:
2696; RV64I-NEXT:    lui a0, %hi(eg)
2697; RV64I-NEXT:    addi a0, a0, %lo(eg)
2698; RV64I-NEXT:    #APP
2699; RV64I-NEXT:    sw zero, 0(a0)
2700; RV64I-NEXT:    #NO_APP
2701; RV64I-NEXT:    #APP
2702; RV64I-NEXT:    sw zero, 0(a0)
2703; RV64I-NEXT:    #NO_APP
2704; RV64I-NEXT:    ret
2705;
2706; RV32I-MEDIUM-LABEL: constraint_A_with_multi_asm:
2707; RV32I-MEDIUM:       # %bb.0:
2708; RV32I-MEDIUM-NEXT:  .Lpcrel_hi31:
2709; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
2710; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi31)
2711; RV32I-MEDIUM-NEXT:    #APP
2712; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2713; RV32I-MEDIUM-NEXT:    #NO_APP
2714; RV32I-MEDIUM-NEXT:    #APP
2715; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
2716; RV32I-MEDIUM-NEXT:    #NO_APP
2717; RV32I-MEDIUM-NEXT:    ret
2718;
2719; RV64I-MEDIUM-LABEL: constraint_A_with_multi_asm:
2720; RV64I-MEDIUM:       # %bb.0:
2721; RV64I-MEDIUM-NEXT:  .Lpcrel_hi31:
2722; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
2723; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi31)
2724; RV64I-MEDIUM-NEXT:    #APP
2725; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2726; RV64I-MEDIUM-NEXT:    #NO_APP
2727; RV64I-MEDIUM-NEXT:    #APP
2728; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
2729; RV64I-MEDIUM-NEXT:    #NO_APP
2730; RV64I-MEDIUM-NEXT:    ret
2731;
2732; RV64I-LARGE-LABEL: constraint_A_with_multi_asm:
2733; RV64I-LARGE:       # %bb.0:
2734; RV64I-LARGE-NEXT:  .Lpcrel_hi31:
2735; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI39_0)
2736; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi31)(a0)
2737; RV64I-LARGE-NEXT:    #APP
2738; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2739; RV64I-LARGE-NEXT:    #NO_APP
2740; RV64I-LARGE-NEXT:    #APP
2741; RV64I-LARGE-NEXT:    sw zero, 0(a0)
2742; RV64I-LARGE-NEXT:    #NO_APP
2743; RV64I-LARGE-NEXT:    ret
2744  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) @eg)
2745  call void asm "sw zero, $0", "=*A"(ptr elementtype(i32) @eg)
2746  ret void
2747}
2748
2749define i32 @constraint_A_with_callbr_multi_operands(i32 %a) {
2750; RV32I-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2751; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
2752; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
2753; RV32I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
2754; RV32I-NO-INTEGRATED-NEXT:    #APP
2755; RV32I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
2756; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
2757; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
2758; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
2759; RV32I-NO-INTEGRATED-NEXT:    ret
2760; RV32I-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2761; RV32I-NO-INTEGRATED-NEXT:    # %fail
2762; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2763; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
2764; RV32I-NO-INTEGRATED-NEXT:    ret
2765;
2766; RV64I-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2767; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
2768; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
2769; RV64I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
2770; RV64I-NO-INTEGRATED-NEXT:    #APP
2771; RV64I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
2772; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
2773; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
2774; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
2775; RV64I-NO-INTEGRATED-NEXT:    ret
2776; RV64I-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2777; RV64I-NO-INTEGRATED-NEXT:    # %fail
2778; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2779; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
2780; RV64I-NO-INTEGRATED-NEXT:    ret
2781;
2782; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2783; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
2784; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi32:
2785; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
2786; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
2787; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
2788; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
2789; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
2790; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
2791; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
2792; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
2793; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2794; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
2795; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2796; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
2797; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
2798;
2799; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2800; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
2801; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi32:
2802; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
2803; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
2804; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
2805; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
2806; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
2807; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
2808; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
2809; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
2810; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2811; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
2812; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2813; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
2814; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
2815;
2816; RV64I-LARGE-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2817; RV64I-LARGE-NO-INTEGRATED:       # %bb.0: # %entry
2818; RV64I-LARGE-NO-INTEGRATED-NEXT:  .Lpcrel_hi32:
2819; RV64I-LARGE-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI40_0)
2820; RV64I-LARGE-NO-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi32)(a1)
2821; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
2822; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
2823; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
2824; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
2825; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 0
2826; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
2827; RV64I-LARGE-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2828; RV64I-LARGE-NO-INTEGRATED-NEXT:    # %fail
2829; RV64I-LARGE-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2830; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 1
2831; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
2832;
2833; RV32I-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2834; RV32I-INTEGRATED:       # %bb.0: # %entry
2835; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
2836; RV32I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
2837; RV32I-INTEGRATED-NEXT:    #APP
2838; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
2839; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
2840; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB40_2
2841; RV32I-INTEGRATED-NEXT:    #NO_APP
2842; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal
2843; RV32I-INTEGRATED-NEXT:    li a0, 0
2844; RV32I-INTEGRATED-NEXT:    ret
2845; RV32I-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2846; RV32I-INTEGRATED-NEXT:    # %fail
2847; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
2848; RV32I-INTEGRATED-NEXT:    li a0, 1
2849; RV32I-INTEGRATED-NEXT:    ret
2850;
2851; RV64I-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2852; RV64I-INTEGRATED:       # %bb.0: # %entry
2853; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
2854; RV64I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
2855; RV64I-INTEGRATED-NEXT:    #APP
2856; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
2857; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
2858; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB40_2
2859; RV64I-INTEGRATED-NEXT:    #NO_APP
2860; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal
2861; RV64I-INTEGRATED-NEXT:    li a0, 0
2862; RV64I-INTEGRATED-NEXT:    ret
2863; RV64I-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2864; RV64I-INTEGRATED-NEXT:    # %fail
2865; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
2866; RV64I-INTEGRATED-NEXT:    li a0, 1
2867; RV64I-INTEGRATED-NEXT:    ret
2868;
2869; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2870; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
2871; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi32:
2872; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
2873; RV32I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
2874; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
2875; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
2876; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
2877; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB40_2
2878; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
2879; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
2880; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
2881; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
2882; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2883; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
2884; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
2885; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
2886; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
2887;
2888; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2889; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
2890; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi32:
2891; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
2892; RV64I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
2893; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
2894; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
2895; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
2896; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB40_2
2897; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
2898; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
2899; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
2900; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
2901; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2902; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
2903; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
2904; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
2905; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
2906;
2907; RV64I-LARGE-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
2908; RV64I-LARGE-INTEGRATED:       # %bb.0: # %entry
2909; RV64I-LARGE-INTEGRATED-NEXT:  .Lpcrel_hi32:
2910; RV64I-LARGE-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI40_0)
2911; RV64I-LARGE-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi32)(a1)
2912; RV64I-LARGE-INTEGRATED-NEXT:    #APP
2913; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
2914; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
2915; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB40_2
2916; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
2917; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.1: # %normal
2918; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 0
2919; RV64I-LARGE-INTEGRATED-NEXT:    ret
2920; RV64I-LARGE-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
2921; RV64I-LARGE-INTEGRATED-NEXT:    # %fail
2922; RV64I-LARGE-INTEGRATED-NEXT:    # Label of block must be emitted
2923; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 1
2924; RV64I-LARGE-INTEGRATED-NEXT:    ret
2925entry:
2926  callbr void asm "sw zero, $0; sw zero, $1; beqz $2, $3", "*A,*A,r,!i"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg, i32 %a) to label %normal [label %fail]
2927
2928normal:
2929  ret i32 0
2930
2931fail:
2932  ret i32 1
2933}
2934
2935define i32 @constraint_A_with_multi_callbr_asm(i32 %a) {
2936; RV32I-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
2937; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
2938; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
2939; RV32I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
2940; RV32I-NO-INTEGRATED-NEXT:    #APP
2941; RV32I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
2942; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
2943; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
2944; RV32I-NO-INTEGRATED-NEXT:    #APP
2945; RV32I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
2946; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
2947; RV32I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
2948; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
2949; RV32I-NO-INTEGRATED-NEXT:    ret
2950; RV32I-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
2951; RV32I-NO-INTEGRATED-NEXT:    # %fail
2952; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2953; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
2954; RV32I-NO-INTEGRATED-NEXT:    ret
2955;
2956; RV64I-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
2957; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
2958; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
2959; RV64I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
2960; RV64I-NO-INTEGRATED-NEXT:    #APP
2961; RV64I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
2962; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
2963; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
2964; RV64I-NO-INTEGRATED-NEXT:    #APP
2965; RV64I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
2966; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
2967; RV64I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
2968; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
2969; RV64I-NO-INTEGRATED-NEXT:    ret
2970; RV64I-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
2971; RV64I-NO-INTEGRATED-NEXT:    # %fail
2972; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2973; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
2974; RV64I-NO-INTEGRATED-NEXT:    ret
2975;
2976; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
2977; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
2978; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi33:
2979; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
2980; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
2981; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
2982; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
2983; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
2984; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
2985; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
2986; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
2987; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
2988; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
2989; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
2990; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
2991; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
2992; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
2993; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
2994; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
2995; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
2996;
2997; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
2998; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
2999; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi33:
3000; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
3001; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
3002; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
3003; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
3004; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
3005; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
3006; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
3007; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
3008; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
3009; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
3010; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
3011; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
3012; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
3013; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
3014; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
3015; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
3016; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
3017;
3018; RV64I-LARGE-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
3019; RV64I-LARGE-NO-INTEGRATED:       # %bb.0: # %entry
3020; RV64I-LARGE-NO-INTEGRATED-NEXT:  .Lpcrel_hi33:
3021; RV64I-LARGE-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI41_0)
3022; RV64I-LARGE-NO-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi33)(a1)
3023; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
3024; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
3025; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
3026; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
3027; RV64I-LARGE-NO-INTEGRATED-NEXT:    #APP
3028; RV64I-LARGE-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
3029; RV64I-LARGE-NO-INTEGRATED-NEXT:    #NO_APP
3030; RV64I-LARGE-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
3031; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 0
3032; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
3033; RV64I-LARGE-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
3034; RV64I-LARGE-NO-INTEGRATED-NEXT:    # %fail
3035; RV64I-LARGE-NO-INTEGRATED-NEXT:    # Label of block must be emitted
3036; RV64I-LARGE-NO-INTEGRATED-NEXT:    li a0, 1
3037; RV64I-LARGE-NO-INTEGRATED-NEXT:    ret
3038;
3039; RV32I-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
3040; RV32I-INTEGRATED:       # %bb.0: # %entry
3041; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
3042; RV32I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
3043; RV32I-INTEGRATED-NEXT:    #APP
3044; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
3045; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3046; RV32I-INTEGRATED-NEXT:    #NO_APP
3047; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal0
3048; RV32I-INTEGRATED-NEXT:    #APP
3049; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
3050; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3051; RV32I-INTEGRATED-NEXT:    #NO_APP
3052; RV32I-INTEGRATED-NEXT:  # %bb.2: # %normal1
3053; RV32I-INTEGRATED-NEXT:    li a0, 0
3054; RV32I-INTEGRATED-NEXT:    ret
3055; RV32I-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
3056; RV32I-INTEGRATED-NEXT:    # %fail
3057; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
3058; RV32I-INTEGRATED-NEXT:    li a0, 1
3059; RV32I-INTEGRATED-NEXT:    ret
3060;
3061; RV64I-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
3062; RV64I-INTEGRATED:       # %bb.0: # %entry
3063; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
3064; RV64I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
3065; RV64I-INTEGRATED-NEXT:    #APP
3066; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
3067; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3068; RV64I-INTEGRATED-NEXT:    #NO_APP
3069; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal0
3070; RV64I-INTEGRATED-NEXT:    #APP
3071; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
3072; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3073; RV64I-INTEGRATED-NEXT:    #NO_APP
3074; RV64I-INTEGRATED-NEXT:  # %bb.2: # %normal1
3075; RV64I-INTEGRATED-NEXT:    li a0, 0
3076; RV64I-INTEGRATED-NEXT:    ret
3077; RV64I-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
3078; RV64I-INTEGRATED-NEXT:    # %fail
3079; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
3080; RV64I-INTEGRATED-NEXT:    li a0, 1
3081; RV64I-INTEGRATED-NEXT:    ret
3082;
3083; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
3084; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
3085; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi33:
3086; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
3087; RV32I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
3088; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
3089; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
3090; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3091; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
3092; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
3093; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
3094; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
3095; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3096; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
3097; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
3098; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
3099; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
3100; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
3101; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
3102; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
3103; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
3104; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
3105;
3106; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
3107; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
3108; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi33:
3109; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
3110; RV64I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
3111; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
3112; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
3113; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3114; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
3115; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
3116; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
3117; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
3118; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3119; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
3120; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
3121; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
3122; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
3123; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
3124; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
3125; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
3126; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
3127; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
3128;
3129; RV64I-LARGE-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
3130; RV64I-LARGE-INTEGRATED:       # %bb.0: # %entry
3131; RV64I-LARGE-INTEGRATED-NEXT:  .Lpcrel_hi33:
3132; RV64I-LARGE-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(.LCPI41_0)
3133; RV64I-LARGE-INTEGRATED-NEXT:    ld a1, %pcrel_lo(.Lpcrel_hi33)(a1)
3134; RV64I-LARGE-INTEGRATED-NEXT:    #APP
3135; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
3136; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3137; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
3138; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.1: # %normal0
3139; RV64I-LARGE-INTEGRATED-NEXT:    #APP
3140; RV64I-LARGE-INTEGRATED-NEXT:    sw zero, 0(a1)
3141; RV64I-LARGE-INTEGRATED-NEXT:    beqz a0, .LBB41_3
3142; RV64I-LARGE-INTEGRATED-NEXT:    #NO_APP
3143; RV64I-LARGE-INTEGRATED-NEXT:  # %bb.2: # %normal1
3144; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 0
3145; RV64I-LARGE-INTEGRATED-NEXT:    ret
3146; RV64I-LARGE-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
3147; RV64I-LARGE-INTEGRATED-NEXT:    # %fail
3148; RV64I-LARGE-INTEGRATED-NEXT:    # Label of block must be emitted
3149; RV64I-LARGE-INTEGRATED-NEXT:    li a0, 1
3150; RV64I-LARGE-INTEGRATED-NEXT:    ret
3151entry:
3152  callbr void asm "sw zero, $0; beqz $1, $2", "=*A,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal0 [label %fail]
3153
3154normal0:
3155  callbr void asm "sw zero, $0; beqz $1, $2", "=*A,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal1 [label %fail]
3156
3157normal1:
3158  ret i32 0
3159
3160fail:
3161  ret i32 1
3162}
3163
3164define void @constraint_A_with_local_1() nounwind {
3165; RV32I-LABEL: constraint_A_with_local_1:
3166; RV32I:       # %bb.0: # %entry
3167; RV32I-NEXT:  .Ltmp6: # Block address taken
3168; RV32I-NEXT:  # %bb.1: # %label
3169; RV32I-NEXT:    lui a0, %hi(.Ltmp6)
3170; RV32I-NEXT:    addi a0, a0, %lo(.Ltmp6)
3171; RV32I-NEXT:    #APP
3172; RV32I-NEXT:    lw zero, 0(a0)
3173; RV32I-NEXT:    #NO_APP
3174; RV32I-NEXT:    ret
3175;
3176; RV64I-LABEL: constraint_A_with_local_1:
3177; RV64I:       # %bb.0: # %entry
3178; RV64I-NEXT:  .Ltmp6: # Block address taken
3179; RV64I-NEXT:  # %bb.1: # %label
3180; RV64I-NEXT:    lui a0, %hi(.Ltmp6)
3181; RV64I-NEXT:    addi a0, a0, %lo(.Ltmp6)
3182; RV64I-NEXT:    #APP
3183; RV64I-NEXT:    lw zero, 0(a0)
3184; RV64I-NEXT:    #NO_APP
3185; RV64I-NEXT:    ret
3186;
3187; RV32I-MEDIUM-LABEL: constraint_A_with_local_1:
3188; RV32I-MEDIUM:       # %bb.0: # %entry
3189; RV32I-MEDIUM-NEXT:  .Ltmp6: # Block address taken
3190; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
3191; RV32I-MEDIUM-NEXT:  .Lpcrel_hi34:
3192; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp6)
3193; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi34)
3194; RV32I-MEDIUM-NEXT:    #APP
3195; RV32I-MEDIUM-NEXT:    lw zero, 0(a0)
3196; RV32I-MEDIUM-NEXT:    #NO_APP
3197; RV32I-MEDIUM-NEXT:    ret
3198;
3199; RV64I-MEDIUM-LABEL: constraint_A_with_local_1:
3200; RV64I-MEDIUM:       # %bb.0: # %entry
3201; RV64I-MEDIUM-NEXT:  .Ltmp6: # Block address taken
3202; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
3203; RV64I-MEDIUM-NEXT:  .Lpcrel_hi34:
3204; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp6)
3205; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi34)
3206; RV64I-MEDIUM-NEXT:    #APP
3207; RV64I-MEDIUM-NEXT:    lw zero, 0(a0)
3208; RV64I-MEDIUM-NEXT:    #NO_APP
3209; RV64I-MEDIUM-NEXT:    ret
3210;
3211; RV64I-LARGE-LABEL: constraint_A_with_local_1:
3212; RV64I-LARGE:       # %bb.0: # %entry
3213; RV64I-LARGE-NEXT:  .Ltmp6: # Block address taken
3214; RV64I-LARGE-NEXT:  # %bb.1: # %label
3215; RV64I-LARGE-NEXT:  .Lpcrel_hi34:
3216; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp6)
3217; RV64I-LARGE-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi34)
3218; RV64I-LARGE-NEXT:    #APP
3219; RV64I-LARGE-NEXT:    lw zero, 0(a0)
3220; RV64I-LARGE-NEXT:    #NO_APP
3221; RV64I-LARGE-NEXT:    ret
3222entry:
3223  br label %label
3224
3225label:
3226  tail call void asm sideeffect "lw zero, $0", "*A"(ptr elementtype(ptr) blockaddress(@constraint_A_with_local_1, %label))
3227  ret void
3228}
3229
3230define void @constraint_A_with_local_2() nounwind {
3231; RV32I-LABEL: constraint_A_with_local_2:
3232; RV32I:       # %bb.0: # %entry
3233; RV32I-NEXT:  .Ltmp7: # Block address taken
3234; RV32I-NEXT:  # %bb.1: # %label
3235; RV32I-NEXT:    lui a0, %hi(.Ltmp7+4)
3236; RV32I-NEXT:    addi a0, a0, %lo(.Ltmp7+4)
3237; RV32I-NEXT:    #APP
3238; RV32I-NEXT:    lw zero, 0(a0)
3239; RV32I-NEXT:    #NO_APP
3240; RV32I-NEXT:    ret
3241;
3242; RV64I-LABEL: constraint_A_with_local_2:
3243; RV64I:       # %bb.0: # %entry
3244; RV64I-NEXT:  .Ltmp7: # Block address taken
3245; RV64I-NEXT:  # %bb.1: # %label
3246; RV64I-NEXT:    lui a0, %hi(.Ltmp7+4)
3247; RV64I-NEXT:    addi a0, a0, %lo(.Ltmp7+4)
3248; RV64I-NEXT:    #APP
3249; RV64I-NEXT:    lw zero, 0(a0)
3250; RV64I-NEXT:    #NO_APP
3251; RV64I-NEXT:    ret
3252;
3253; RV32I-MEDIUM-LABEL: constraint_A_with_local_2:
3254; RV32I-MEDIUM:       # %bb.0: # %entry
3255; RV32I-MEDIUM-NEXT:  .Ltmp7: # Block address taken
3256; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
3257; RV32I-MEDIUM-NEXT:  .Lpcrel_hi35:
3258; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp7+4)
3259; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi35)
3260; RV32I-MEDIUM-NEXT:    #APP
3261; RV32I-MEDIUM-NEXT:    lw zero, 0(a0)
3262; RV32I-MEDIUM-NEXT:    #NO_APP
3263; RV32I-MEDIUM-NEXT:    ret
3264;
3265; RV64I-MEDIUM-LABEL: constraint_A_with_local_2:
3266; RV64I-MEDIUM:       # %bb.0: # %entry
3267; RV64I-MEDIUM-NEXT:  .Ltmp7: # Block address taken
3268; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
3269; RV64I-MEDIUM-NEXT:  .Lpcrel_hi35:
3270; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp7+4)
3271; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi35)
3272; RV64I-MEDIUM-NEXT:    #APP
3273; RV64I-MEDIUM-NEXT:    lw zero, 0(a0)
3274; RV64I-MEDIUM-NEXT:    #NO_APP
3275; RV64I-MEDIUM-NEXT:    ret
3276;
3277; RV64I-LARGE-LABEL: constraint_A_with_local_2:
3278; RV64I-LARGE:       # %bb.0: # %entry
3279; RV64I-LARGE-NEXT:  .Ltmp7: # Block address taken
3280; RV64I-LARGE-NEXT:  # %bb.1: # %label
3281; RV64I-LARGE-NEXT:  .Lpcrel_hi35:
3282; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp7+4)
3283; RV64I-LARGE-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi35)
3284; RV64I-LARGE-NEXT:    #APP
3285; RV64I-LARGE-NEXT:    lw zero, 0(a0)
3286; RV64I-LARGE-NEXT:    #NO_APP
3287; RV64I-LARGE-NEXT:    ret
3288entry:
3289  br label %label
3290
3291label:
3292  call void asm "lw zero, $0", "*A"(ptr elementtype(i32) getelementptr (i8, ptr blockaddress(@constraint_A_with_local_2, %label), i32 4))
3293  ret void
3294}
3295
3296define void @constraint_A_with_local_3() nounwind {
3297; RV32I-LABEL: constraint_A_with_local_3:
3298; RV32I:       # %bb.0: # %entry
3299; RV32I-NEXT:  .Ltmp8: # Block address taken
3300; RV32I-NEXT:  # %bb.1: # %label
3301; RV32I-NEXT:    lui a0, %hi(.Ltmp8+2000)
3302; RV32I-NEXT:    addi a0, a0, %lo(.Ltmp8+2000)
3303; RV32I-NEXT:    #APP
3304; RV32I-NEXT:    lw zero, 0(a0)
3305; RV32I-NEXT:    #NO_APP
3306; RV32I-NEXT:    ret
3307;
3308; RV64I-LABEL: constraint_A_with_local_3:
3309; RV64I:       # %bb.0: # %entry
3310; RV64I-NEXT:  .Ltmp8: # Block address taken
3311; RV64I-NEXT:  # %bb.1: # %label
3312; RV64I-NEXT:    lui a0, %hi(.Ltmp8+2000)
3313; RV64I-NEXT:    addi a0, a0, %lo(.Ltmp8+2000)
3314; RV64I-NEXT:    #APP
3315; RV64I-NEXT:    lw zero, 0(a0)
3316; RV64I-NEXT:    #NO_APP
3317; RV64I-NEXT:    ret
3318;
3319; RV32I-MEDIUM-LABEL: constraint_A_with_local_3:
3320; RV32I-MEDIUM:       # %bb.0: # %entry
3321; RV32I-MEDIUM-NEXT:  .Ltmp8: # Block address taken
3322; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
3323; RV32I-MEDIUM-NEXT:  .Lpcrel_hi36:
3324; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp8+2000)
3325; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi36)
3326; RV32I-MEDIUM-NEXT:    #APP
3327; RV32I-MEDIUM-NEXT:    lw zero, 0(a0)
3328; RV32I-MEDIUM-NEXT:    #NO_APP
3329; RV32I-MEDIUM-NEXT:    ret
3330;
3331; RV64I-MEDIUM-LABEL: constraint_A_with_local_3:
3332; RV64I-MEDIUM:       # %bb.0: # %entry
3333; RV64I-MEDIUM-NEXT:  .Ltmp8: # Block address taken
3334; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
3335; RV64I-MEDIUM-NEXT:  .Lpcrel_hi36:
3336; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp8+2000)
3337; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi36)
3338; RV64I-MEDIUM-NEXT:    #APP
3339; RV64I-MEDIUM-NEXT:    lw zero, 0(a0)
3340; RV64I-MEDIUM-NEXT:    #NO_APP
3341; RV64I-MEDIUM-NEXT:    ret
3342;
3343; RV64I-LARGE-LABEL: constraint_A_with_local_3:
3344; RV64I-LARGE:       # %bb.0: # %entry
3345; RV64I-LARGE-NEXT:  .Ltmp8: # Block address taken
3346; RV64I-LARGE-NEXT:  # %bb.1: # %label
3347; RV64I-LARGE-NEXT:  .Lpcrel_hi36:
3348; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.Ltmp8+2000)
3349; RV64I-LARGE-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi36)
3350; RV64I-LARGE-NEXT:    #APP
3351; RV64I-LARGE-NEXT:    lw zero, 0(a0)
3352; RV64I-LARGE-NEXT:    #NO_APP
3353; RV64I-LARGE-NEXT:    ret
3354entry:
3355  br label %label
3356
3357label:
3358  call void asm "lw zero, $0", "*A"(ptr elementtype(i32) getelementptr (i8, ptr blockaddress(@constraint_A_with_local_3, %label), i32 2000))
3359  ret void
3360}
3361
3362@_ZN5repro9MY_BUFFER17hb0f674501d5980a6E = external global <{ [16 x i8] }>
3363
3364; Address is not used by a memory constraint.
3365define void @should_not_fold() {
3366; RV32I-LABEL: should_not_fold:
3367; RV32I:       # %bb.0: # %start
3368; RV32I-NEXT:    lui a0, %hi(_ZN5repro9MY_BUFFER17hb0f674501d5980a6E)
3369; RV32I-NEXT:    addi a0, a0, %lo(_ZN5repro9MY_BUFFER17hb0f674501d5980a6E)
3370; RV32I-NEXT:    #APP
3371; RV32I-NEXT:    ecall
3372; RV32I-NEXT:    #NO_APP
3373; RV32I-NEXT:    ret
3374;
3375; RV64I-LABEL: should_not_fold:
3376; RV64I:       # %bb.0: # %start
3377; RV64I-NEXT:    lui a0, %hi(_ZN5repro9MY_BUFFER17hb0f674501d5980a6E)
3378; RV64I-NEXT:    addi a0, a0, %lo(_ZN5repro9MY_BUFFER17hb0f674501d5980a6E)
3379; RV64I-NEXT:    #APP
3380; RV64I-NEXT:    ecall
3381; RV64I-NEXT:    #NO_APP
3382; RV64I-NEXT:    ret
3383;
3384; RV32I-MEDIUM-LABEL: should_not_fold:
3385; RV32I-MEDIUM:       # %bb.0: # %start
3386; RV32I-MEDIUM-NEXT:  .Lpcrel_hi37:
3387; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(_ZN5repro9MY_BUFFER17hb0f674501d5980a6E)
3388; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi37)
3389; RV32I-MEDIUM-NEXT:    #APP
3390; RV32I-MEDIUM-NEXT:    ecall
3391; RV32I-MEDIUM-NEXT:    #NO_APP
3392; RV32I-MEDIUM-NEXT:    ret
3393;
3394; RV64I-MEDIUM-LABEL: should_not_fold:
3395; RV64I-MEDIUM:       # %bb.0: # %start
3396; RV64I-MEDIUM-NEXT:  .Lpcrel_hi37:
3397; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(_ZN5repro9MY_BUFFER17hb0f674501d5980a6E)
3398; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi37)
3399; RV64I-MEDIUM-NEXT:    #APP
3400; RV64I-MEDIUM-NEXT:    ecall
3401; RV64I-MEDIUM-NEXT:    #NO_APP
3402; RV64I-MEDIUM-NEXT:    ret
3403;
3404; RV64I-LARGE-LABEL: should_not_fold:
3405; RV64I-LARGE:       # %bb.0: # %start
3406; RV64I-LARGE-NEXT:  .Lpcrel_hi37:
3407; RV64I-LARGE-NEXT:    auipc a0, %pcrel_hi(.LCPI45_0)
3408; RV64I-LARGE-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi37)(a0)
3409; RV64I-LARGE-NEXT:    #APP
3410; RV64I-LARGE-NEXT:    ecall
3411; RV64I-LARGE-NEXT:    #NO_APP
3412; RV64I-LARGE-NEXT:    ret
3413start:
3414  %0 = tail call ptr asm sideeffect alignstack "ecall", "=&{x10},0,~{vtype},~{vl},~{vxsat},~{vxrm},~{memory}"(ptr @_ZN5repro9MY_BUFFER17hb0f674501d5980a6E)
3415  ret void
3416}
3417