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