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