[llvm] [RISCV] Mark symbols used in inline asm for relocations as referenced (PR #104925)

Anton Sidorenko via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 20 06:00:34 PDT 2024


https://github.com/asi-sc created https://github.com/llvm/llvm-project/pull/104925

Commit 5cd8d53cac00f taught RISCVMergeBaseOffset to handle inline asm, however
there is at least one case uncovered for integrated as.

In the example below compiler generates pcrel relocation (mcmodel=medany)
```
    volatile double double_val = 1.0;
    void foo() {
        asm volatile("fld f0, %0 \n\t" : : "m"(double_val) : "memory");
    }
```

And fails with the folliwng error
```
    error: could not find corresponding %pcrel_hi
          |       "fld f0, %0 \n\t"
    <inline asm>:1:2: note: instantiated into assembly here
          |         fld f0, %pcrel_lo(.Lpcrel_hi0)(a0)
```

After transformations MachineFunction contains inline asm instructions with
'.Lpcrel_hi0' symbol that is not defined in inline asm, but referenced.
```
   ... = AUIPC ...(riscv-pcrel-hi) @double_val, pre-instr-symbol <mcsymbol .Lpcrel_hi0>
   INLINEASM &"fld f0, $0 \0A\09" ... target-flags(riscv-pcrel-lo) <mcsymbol .Lpcrel_hi0>
```

So, when AsmParser processes 'fld', it has to create a new symbol as
'.Lpcrel_hi0' already exists but not known to be referenced in inline asm.
AsmParser avoids conflicts by renaming referenced by 'fld' symbol with
'.Lpcrel_hi00' name which does not exist. Resulting erroneous asm
```
    .Lpcrel_hi0:
        auipc   a0, %pcrel_hi(double_val)
        #APP
        fld     ft0, %pcrel_lo(.Lpcrel_hi00)(a0)
```

This change adds symbols used in memory operands to the list of referenced ones.

Godbolt link: https://godbolt.org/z/aqrrsWKoK -- on the left you can find incorrect labels for the integrated-as and on the right an error when compiling to the binary object.

Note that I change tests in the first commit and the second commit shows the real difference after the fix.


>From 35b84beda1d84bceb1378bad49db3418134e1b80 Mon Sep 17 00:00:00 2001
From: Anton Sidorenko <anton.sidorenko at syntacore.com>
Date: Fri, 16 Aug 2024 16:30:29 +0300
Subject: [PATCH 1/2] Precommit test

---
 .../RISCV/inline-asm-mem-constraint-2.ll      |   95 +
 .../RISCV/inline-asm-mem-constraint.ll        | 2850 +++++++++++------
 2 files changed, 1945 insertions(+), 1000 deletions(-)
 create mode 100644 llvm/test/CodeGen/RISCV/inline-asm-mem-constraint-2.ll

diff --git a/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint-2.ll b/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint-2.ll
new file mode 100644
index 00000000000000..f0bad08bd44388
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint-2.ll
@@ -0,0 +1,95 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; integrated-as fails with error: unexpected token
+;   sw zero, %lo(eg)(a0) \n sw zero, %lo(eg)(a0)
+;                        ^
+; RUN: llc -mtriple=riscv32 -verify-machineinstrs -no-integrated-as < %s \
+; RUN:   | FileCheck -check-prefixes=RV32I %s
+; RUN: llc -mtriple=riscv64 -verify-machineinstrs -no-integrated-as < %s \
+; RUN:   | FileCheck -check-prefixes=RV64I %s
+; RUN: llc -mtriple=riscv32 -code-model=medium -verify-machineinstrs -no-integrated-as < %s \
+; RUN:   | FileCheck -check-prefixes=RV32I-MEDIUM %s
+; RUN: llc -mtriple=riscv64 -code-model=medium -verify-machineinstrs -no-integrated-as < %s \
+; RUN:   | FileCheck -check-prefixes=RV64I-MEDIUM %s
+
+ at eg = external global [4000 x i32], align 4
+ at ewg = extern_weak global [4000 x i32], align 4
+
+define void @constraint_o_with_multi_operands() nounwind {
+; RV32I-LABEL: constraint_o_with_multi_operands:
+; RV32I:       # %bb.0:
+; RV32I-NEXT:    lui a0, %hi(eg)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    sw zero, %lo(eg)(a0) \n sw zero, %lo(eg)(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
+;
+; RV64I-LABEL: constraint_o_with_multi_operands:
+; RV64I:       # %bb.0:
+; RV64I-NEXT:    lui a0, %hi(eg)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    sw zero, %lo(eg)(a0) \n sw zero, %lo(eg)(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
+;
+; RV32I-MEDIUM-LABEL: constraint_o_with_multi_operands:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi0:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0) \n sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
+;
+; RV64I-MEDIUM-LABEL: constraint_o_with_multi_operands:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi0:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0) \n sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
+  call void asm "sw zero, $0 \n sw zero, $1", "=*o,=*o"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg)
+  ret void
+}
+
+define void @constraint_A_with_multi_operands() nounwind {
+; RV32I-LABEL: constraint_A_with_multi_operands:
+; RV32I:       # %bb.0:
+; RV32I-NEXT:    lui a0, %hi(eg)
+; RV32I-NEXT:    addi a0, a0, %lo(eg)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
+;
+; RV64I-LABEL: constraint_A_with_multi_operands:
+; RV64I:       # %bb.0:
+; RV64I-NEXT:    lui a0, %hi(eg)
+; RV64I-NEXT:    addi a0, a0, %lo(eg)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
+;
+; RV32I-MEDIUM-LABEL: constraint_A_with_multi_operands:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi1:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi1)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
+;
+; RV64I-MEDIUM-LABEL: constraint_A_with_multi_operands:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi1:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi1)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
+  call void asm "sw zero, $0 \n sw zero, $1", "=*A,=*A"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg)
+  ret void
+}
diff --git a/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll b/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll
index 6666d92feaac2e..85a1bd09377217 100644
--- a/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll
+++ b/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll
@@ -1,12 +1,20 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs -no-integrated-as < %s \
-; RUN:   | FileCheck -check-prefixes=RV32I %s
+; RUN:   | FileCheck -check-prefixes=RV32I,RV32I-NO-INTEGRATED %s
 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs -no-integrated-as < %s \
-; RUN:   | FileCheck -check-prefixes=RV64I %s
+; RUN:   | FileCheck -check-prefixes=RV64I,RV64I-NO-INTEGRATED %s
 ; RUN: llc -mtriple=riscv32 -code-model=medium -verify-machineinstrs -no-integrated-as < %s \
-; RUN:   | FileCheck -check-prefixes=RV32I-MEDIUM %s
+; RUN:   | FileCheck -check-prefixes=RV32I-MEDIUM,RV32I-MEDIUM-NO-INTEGRATED %s
 ; RUN: llc -mtriple=riscv64 -code-model=medium -verify-machineinstrs -no-integrated-as < %s \
-; RUN:   | FileCheck -check-prefixes=RV64I-MEDIUM %s
+; RUN:   | FileCheck -check-prefixes=RV64I-MEDIUM,RV64I-MEDIUM-NO-INTEGRATED %s
+; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
+; RUN:   | FileCheck -check-prefixes=RV32I,RV32I-INTEGRATED %s
+; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
+; RUN:   | FileCheck -check-prefixes=RV64I,RV64I-INTEGRATED %s
+; RUN: llc -mtriple=riscv32 -code-model=medium -verify-machineinstrs < %s \
+; RUN:   | FileCheck -check-prefixes=RV32I-MEDIUM,RV32I-MEDIUM-INTEGRATED %s
+; RUN: llc -mtriple=riscv64 -code-model=medium -verify-machineinstrs < %s \
+; RUN:   | FileCheck -check-prefixes=RV64I-MEDIUM,RV64I-MEDIUM-INTEGRATED %s
 
 @eg = external global [4000 x i32], align 4
 @ewg = extern_weak global [4000 x i32], align 4
@@ -121,23 +129,41 @@ define void @constraint_m_with_global_1() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-LABEL: constraint_m_with_global_1:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi0:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_global_1:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi0:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_1:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_1:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_1:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi00)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_1:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi00)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
   ret void
 }
@@ -159,23 +185,41 @@ define void @constraint_m_with_global_2() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-LABEL: constraint_m_with_global_2:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi1:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_global_2:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi1:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_2:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi1:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_2:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi1:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_2:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi1:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi110)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_2:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi1:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi110)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 1))
   ret void
 }
@@ -197,23 +241,41 @@ define void @constraint_m_with_global_3() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-LABEL: constraint_m_with_global_3:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi2:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_global_3:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi2:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_3:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi2:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_3:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi2:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_3:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi2:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi210)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_3:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi2:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi210)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 2000))
   ret void
 }
@@ -345,47 +407,89 @@ define void @constraint_m_with_extern_weak_global_3() nounwind {
 }
 
 define void @constraint_m_with_local_1() nounwind {
-; RV32I-LABEL: constraint_m_with_local_1:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:  .Ltmp0: # Block address taken
-; RV32I-NEXT:  # %bb.1: # %label
-; RV32I-NEXT:    lui a0, %hi(.Ltmp0)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    lw zero, %lo(.Ltmp0)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_m_with_local_1:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:  .Ltmp0: # Block address taken
-; RV64I-NEXT:  # %bb.1: # %label
-; RV64I-NEXT:    lui a0, %hi(.Ltmp0)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    lw zero, %lo(.Ltmp0)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_m_with_local_1:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Ltmp0: # Block address taken
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi6:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_local_1:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Ltmp0: # Block address taken
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi6:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp0)(a0)
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp0)(a0)
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi6:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi6:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp00)(a0)
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp00)(a0)
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi6:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi60)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_1:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi6:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi60)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   br label %label
 
@@ -395,47 +499,89 @@ label:
 }
 
 define void @constraint_m_with_local_2() nounwind {
-; RV32I-LABEL: constraint_m_with_local_2:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:  .Ltmp1: # Block address taken
-; RV32I-NEXT:  # %bb.1: # %label
-; RV32I-NEXT:    lui a0, %hi(.Ltmp1+4)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_m_with_local_2:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:  .Ltmp1: # Block address taken
-; RV64I-NEXT:  # %bb.1: # %label
-; RV64I-NEXT:    lui a0, %hi(.Ltmp1+4)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_m_with_local_2:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Ltmp1: # Block address taken
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi7:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_local_2:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Ltmp1: # Block address taken
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi7:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi7:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi7:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp10+4)(a0)
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp10+4)(a0)
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi7:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi70)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_2:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi7:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi70)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   br label %label
 
@@ -445,47 +591,89 @@ label:
 }
 
 define void @constraint_m_with_local_3() nounwind {
-; RV32I-LABEL: constraint_m_with_local_3:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:  .Ltmp2: # Block address taken
-; RV32I-NEXT:  # %bb.1: # %label
-; RV32I-NEXT:    lui a0, %hi(.Ltmp2+2000)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_m_with_local_3:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:  .Ltmp2: # Block address taken
-; RV64I-NEXT:  # %bb.1: # %label
-; RV64I-NEXT:    lui a0, %hi(.Ltmp2+2000)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_m_with_local_3:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Ltmp2: # Block address taken
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi8:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_local_3:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Ltmp2: # Block address taken
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi8:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi8:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi8:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp20+2000)(a0)
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp20+2000)(a0)
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi8:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi80)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_3:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi8:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi80)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   br label %label
 
@@ -495,39 +683,77 @@ label:
 }
 
 define void @constraint_m_with_multi_operands() nounwind {
-; RV32I-LABEL: constraint_m_with_multi_operands:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    lui a0, %hi(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a0); sw zero, %lo(eg)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_m_with_multi_operands:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    lui a0, %hi(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a0); sw zero, %lo(eg)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_m_with_multi_operands:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi9:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0); sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_multi_operands:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi9:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0); sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV32I-NO-INTEGRATED:       # %bb.0:
+; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(eg)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0); sw zero, %lo(eg)(a0)
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV64I-NO-INTEGRATED:       # %bb.0:
+; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(eg)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0); sw zero, %lo(eg)(a0)
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi9:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0); sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi9:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0); sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV32I-INTEGRATED:       # %bb.0:
+; RV32I-INTEGRATED-NEXT:    lui a0, %hi(eg)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV64I-INTEGRATED:       # %bb.0:
+; RV64I-INTEGRATED-NEXT:    lui a0, %hi(eg)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a0)
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi9:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_operands:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi9:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0; sw zero, $1", "=*m,=*m"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg)
   ret void
 }
@@ -555,96 +781,190 @@ define void @constraint_m_with_multi_asm() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-LABEL: constraint_m_with_multi_asm:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi10:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_multi_asm:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi10:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_asm:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi10:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_asm:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi10:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_asm:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi10:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_asm:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi10:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
   ret void
 }
 
 define i32 @constraint_m_with_callbr_multi_operands(i32 %a) {
-; RV32I-LABEL: constraint_m_with_callbr_multi_operands:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:    lui a1, %hi(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB14_2
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.1: # %normal
-; RV32I-NEXT:    li a0, 0
-; RV32I-NEXT:    ret
-; RV32I-NEXT:  .LBB14_2: # Block address taken
-; RV32I-NEXT:    # %fail
-; RV32I-NEXT:    # Label of block must be emitted
-; RV32I-NEXT:    li a0, 1
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_m_with_callbr_multi_operands:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:    lui a1, %hi(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB14_2
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.1: # %normal
-; RV64I-NEXT:    li a0, 0
-; RV64I-NEXT:    ret
-; RV64I-NEXT:  .LBB14_2: # Block address taken
-; RV64I-NEXT:    # %fail
-; RV64I-NEXT:    # Label of block must be emitted
-; RV64I-NEXT:    li a0, 1
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_m_with_callbr_multi_operands:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi11:
-; RV32I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); beqz a0, .LBB14_2
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %normal
-; RV32I-MEDIUM-NEXT:    li a0, 0
-; RV32I-MEDIUM-NEXT:    ret
-; RV32I-MEDIUM-NEXT:  .LBB14_2: # Block address taken
-; RV32I-MEDIUM-NEXT:    # %fail
-; RV32I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV32I-MEDIUM-NEXT:    li a0, 1
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_callbr_multi_operands:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi11:
-; RV64I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); beqz a0, .LBB14_2
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %normal
-; RV64I-MEDIUM-NEXT:    li a0, 0
-; RV64I-MEDIUM-NEXT:    ret
-; RV64I-MEDIUM-NEXT:  .LBB14_2: # Block address taken
-; RV64I-MEDIUM-NEXT:    # %fail
-; RV64I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV64I-MEDIUM-NEXT:    li a0, 1
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB14_2
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-NO-INTEGRATED-NEXT:    ret
+; RV32I-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB14_2
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-NO-INTEGRATED-NEXT:    ret
+; RV64I-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi11:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); beqz a0, .LBB14_2
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi11:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); sw zero, %pcrel_lo(.Lpcrel_hi11)(a1); beqz a0, .LBB14_2
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB14_2
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-INTEGRATED-NEXT:    li a0, 0
+; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV32I-INTEGRATED-NEXT:    # %fail
+; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-INTEGRATED-NEXT:    li a0, 1
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB14_2
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-INTEGRATED-NEXT:    li a0, 0
+; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV64I-INTEGRATED-NEXT:    # %fail
+; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-INTEGRATED-NEXT:    li a0, 1
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi11:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB14_2
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_callbr_multi_operands:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi11:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB14_2
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB14_2: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   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]
 
@@ -656,83 +976,169 @@ fail:
 }
 
 define i32 @constraint_m_with_multi_callbr_asm(i32 %a) {
-; RV32I-LABEL: constraint_m_with_multi_callbr_asm:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:    lui a1, %hi(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.1: # %normal0
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.2: # %normal1
-; RV32I-NEXT:    li a0, 0
-; RV32I-NEXT:    ret
-; RV32I-NEXT:  .LBB15_3: # Block address taken
-; RV32I-NEXT:    # %fail
-; RV32I-NEXT:    # Label of block must be emitted
-; RV32I-NEXT:    li a0, 1
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_m_with_multi_callbr_asm:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:    lui a1, %hi(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.1: # %normal0
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.2: # %normal1
-; RV64I-NEXT:    li a0, 0
-; RV64I-NEXT:    ret
-; RV64I-NEXT:  .LBB15_3: # Block address taken
-; RV64I-NEXT:    # %fail
-; RV64I-NEXT:    # Label of block must be emitted
-; RV64I-NEXT:    li a0, 1
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_m_with_multi_callbr_asm:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi12:
-; RV32I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %normal0
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.2: # %normal1
-; RV32I-MEDIUM-NEXT:    li a0, 0
-; RV32I-MEDIUM-NEXT:    ret
-; RV32I-MEDIUM-NEXT:  .LBB15_3: # Block address taken
-; RV32I-MEDIUM-NEXT:    # %fail
-; RV32I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV32I-MEDIUM-NEXT:    li a0, 1
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_m_with_multi_callbr_asm:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi12:
-; RV64I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %normal0
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.2: # %normal1
-; RV64I-MEDIUM-NEXT:    li a0, 0
-; RV64I-MEDIUM-NEXT:    ret
-; RV64I-MEDIUM-NEXT:  .LBB15_3: # Block address taken
-; RV64I-MEDIUM-NEXT:    # %fail
-; RV64I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV64I-MEDIUM-NEXT:    li a0, 1
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-NO-INTEGRATED-NEXT:    ret
+; RV32I-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB15_3
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-NO-INTEGRATED-NEXT:    ret
+; RV64I-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi12:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi12:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1); beqz a0, .LBB15_3
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-INTEGRATED-NEXT:    li a0, 0
+; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV32I-INTEGRATED-NEXT:    # %fail
+; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-INTEGRATED-NEXT:    li a0, 1
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-INTEGRATED-NEXT:    li a0, 0
+; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV64I-INTEGRATED-NEXT:    # %fail
+; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-INTEGRATED-NEXT:    li a0, 1
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi12:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_callbr_asm:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi12:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB15_3: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   callbr void asm "sw zero, $0; beqz $1, $2", "=*m,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal0 [label %fail]
 
@@ -856,23 +1262,41 @@ define void @constraint_o_with_global_1() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-LABEL: constraint_o_with_global_1:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi13:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_global_1:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi13:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_1:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi13:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_1:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi13:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_1:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi13:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi130)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_1:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi13:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi130)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
   ret void
 }
@@ -894,23 +1318,41 @@ define void @constraint_o_with_global_2() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-LABEL: constraint_o_with_global_2:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi14:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_global_2:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi14:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_2:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi14:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_2:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi14:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_2:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi14:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi140)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_2:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi14:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi140)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 1))
   ret void
 }
@@ -932,23 +1374,41 @@ define void @constraint_o_with_global_3() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-LABEL: constraint_o_with_global_3:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi15:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_global_3:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi15:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_3:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi15:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_3:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi15:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_3:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi15:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi150)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_3:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi15:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi150)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 2000))
   ret void
 }
@@ -1079,245 +1539,387 @@ define void @constraint_o_with_extern_weak_global_3() nounwind {
   ret void
 }
 
-define void @constraint_o_with_multi_operands() nounwind {
-; RV32I-LABEL: constraint_o_with_multi_operands:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    lui a0, %hi(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a0) \n sw zero, %lo(eg)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_o_with_multi_operands:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    lui a0, %hi(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a0) \n sw zero, %lo(eg)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_o_with_multi_operands:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi19:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0) \n sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_multi_operands:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi19:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0) \n sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
-  call void asm "sw zero, $0 \n sw zero, $1", "=*o,=*o"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg)
-  ret void
-}
-
 define void @constraint_o_with_multi_asm() nounwind {
-; RV32I-LABEL: constraint_o_with_multi_asm:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    lui a0, %hi(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_o_with_multi_asm:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    lui a0, %hi(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_o_with_multi_asm:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi20:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_multi_asm:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi20:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
-  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
-  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
-  ret void
-}
-
-define i32 @constraint_o_with_callbr_multi_operands(i32 %a) {
-; RV32I-LABEL: constraint_o_with_callbr_multi_operands:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:    lui a1, %hi(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB27_2
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.1: # %normal
-; RV32I-NEXT:    li a0, 0
-; RV32I-NEXT:    ret
-; RV32I-NEXT:  .LBB27_2: # Block address taken
-; RV32I-NEXT:    # %fail
-; RV32I-NEXT:    # Label of block must be emitted
-; RV32I-NEXT:    li a0, 1
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_o_with_callbr_multi_operands:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:    lui a1, %hi(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB27_2
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.1: # %normal
-; RV64I-NEXT:    li a0, 0
-; RV64I-NEXT:    ret
-; RV64I-NEXT:  .LBB27_2: # Block address taken
-; RV64I-NEXT:    # %fail
-; RV64I-NEXT:    # Label of block must be emitted
-; RV64I-NEXT:    li a0, 1
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_o_with_callbr_multi_operands:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi21:
-; RV32I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_2
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %normal
-; RV32I-MEDIUM-NEXT:    li a0, 0
-; RV32I-MEDIUM-NEXT:    ret
-; RV32I-MEDIUM-NEXT:  .LBB27_2: # Block address taken
-; RV32I-MEDIUM-NEXT:    # %fail
-; RV32I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV32I-MEDIUM-NEXT:    li a0, 1
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_callbr_multi_operands:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi21:
-; RV64I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_2
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %normal
-; RV64I-MEDIUM-NEXT:    li a0, 0
-; RV64I-MEDIUM-NEXT:    ret
-; RV64I-MEDIUM-NEXT:  .LBB27_2: # Block address taken
-; RV64I-MEDIUM-NEXT:    # %fail
-; RV64I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV64I-MEDIUM-NEXT:    li a0, 1
-; RV64I-MEDIUM-NEXT:    ret
-entry:
-  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]
-
-normal:
-  ret i32 0
-
-fail:
-  ret i32 1
-}
-
-define i32 @constraint_o_with_multi_callbr_asm(i32 %a) {
-; RV32I-LABEL: constraint_o_with_multi_callbr_asm:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:    lui a1, %hi(eg)
+; RV32I-LABEL: constraint_o_with_multi_asm:
+; RV32I:       # %bb.0:
+; RV32I-NEXT:    lui a0, %hi(eg)
 ; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB28_3
+; RV32I-NEXT:    sw zero, %lo(eg)(a0)
 ; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.1: # %normal0
 ; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB28_3
+; RV32I-NEXT:    sw zero, %lo(eg)(a0)
 ; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.2: # %normal1
-; RV32I-NEXT:    li a0, 0
-; RV32I-NEXT:    ret
-; RV32I-NEXT:  .LBB28_3: # Block address taken
-; RV32I-NEXT:    # %fail
-; RV32I-NEXT:    # Label of block must be emitted
-; RV32I-NEXT:    li a0, 1
 ; RV32I-NEXT:    ret
 ;
-; RV64I-LABEL: constraint_o_with_multi_callbr_asm:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:    lui a1, %hi(eg)
+; RV64I-LABEL: constraint_o_with_multi_asm:
+; RV64I:       # %bb.0:
+; RV64I-NEXT:    lui a0, %hi(eg)
 ; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB28_3
+; RV64I-NEXT:    sw zero, %lo(eg)(a0)
 ; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.1: # %normal0
 ; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB28_3
+; RV64I-NEXT:    sw zero, %lo(eg)(a0)
 ; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.2: # %normal1
-; RV64I-NEXT:    li a0, 0
 ; RV64I-NEXT:    ret
-; RV64I-NEXT:  .LBB28_3: # Block address taken
-; RV64I-NEXT:    # %fail
-; RV64I-NEXT:    # Label of block must be emitted
-; RV64I-NEXT:    li a0, 1
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_o_with_multi_callbr_asm:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi22:
-; RV32I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi22)(a1); beqz a0, .LBB28_3
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %normal0
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi22)(a1); beqz a0, .LBB28_3
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.2: # %normal1
-; RV32I-MEDIUM-NEXT:    li a0, 0
-; RV32I-MEDIUM-NEXT:    ret
-; RV32I-MEDIUM-NEXT:  .LBB28_3: # Block address taken
-; RV32I-MEDIUM-NEXT:    # %fail
-; RV32I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV32I-MEDIUM-NEXT:    li a0, 1
-; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-LABEL: constraint_o_with_multi_callbr_asm:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi22:
-; RV64I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi22)(a1); beqz a0, .LBB28_3
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %normal0
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi22)(a1); beqz a0, .LBB28_3
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.2: # %normal1
-; RV64I-MEDIUM-NEXT:    li a0, 0
-; RV64I-MEDIUM-NEXT:    ret
-; RV64I-MEDIUM-NEXT:  .LBB28_3: # Block address taken
-; RV64I-MEDIUM-NEXT:    # %fail
-; RV64I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV64I-MEDIUM-NEXT:    li a0, 1
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_asm:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi19:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_asm:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi19:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_asm:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi19:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_asm:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi19:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
+  call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
+  ret void
+}
+
+define i32 @constraint_o_with_callbr_multi_operands(i32 %a) {
+; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB26_2
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-NO-INTEGRATED-NEXT:    ret
+; RV32I-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); sw zero, %lo(eg)(a1); beqz a0, .LBB26_2
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-NO-INTEGRATED-NEXT:    ret
+; RV64I-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi20:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); beqz a0, .LBB26_2
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi20:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); sw zero, %pcrel_lo(.Lpcrel_hi20)(a1); beqz a0, .LBB26_2
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB26_2
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-INTEGRATED-NEXT:    li a0, 0
+; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV32I-INTEGRATED-NEXT:    # %fail
+; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-INTEGRATED-NEXT:    li a0, 1
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB26_2
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-INTEGRATED-NEXT:    li a0, 0
+; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV64I-INTEGRATED-NEXT:    # %fail
+; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-INTEGRATED-NEXT:    li a0, 1
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi20:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB26_2
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_callbr_multi_operands:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi20:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB26_2
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB26_2: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+entry:
+  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]
+
+normal:
+  ret i32 0
+
+fail:
+  ret i32 1
+}
+
+define i32 @constraint_o_with_multi_callbr_asm(i32 %a) {
+; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-NO-INTEGRATED-NEXT:    ret
+; RV32I-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1); beqz a0, .LBB27_3
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-NO-INTEGRATED-NEXT:    ret
+; RV64I-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi21:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi21:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1); beqz a0, .LBB27_3
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-INTEGRATED-NEXT:    li a0, 0
+; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV32I-INTEGRATED-NEXT:    # %fail
+; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-INTEGRATED-NEXT:    li a0, 1
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, %lo(eg)(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-INTEGRATED-NEXT:    li a0, 0
+; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV64I-INTEGRATED-NEXT:    # %fail
+; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-INTEGRATED-NEXT:    li a0, 1
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi21:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_callbr_asm:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi21:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB27_3: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   callbr void asm "sw zero, $0; beqz $1, $2", "=*o,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal0 [label %fail]
 
@@ -1332,47 +1934,89 @@ fail:
 }
 
 define void @constraint_o_with_local_1() nounwind {
-; RV32I-LABEL: constraint_o_with_local_1:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:  .Ltmp3: # Block address taken
-; RV32I-NEXT:  # %bb.1: # %label
-; RV32I-NEXT:    lui a0, %hi(.Ltmp3)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    lw zero, %lo(.Ltmp3)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_o_with_local_1:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:  .Ltmp3: # Block address taken
-; RV64I-NEXT:  # %bb.1: # %label
-; RV64I-NEXT:    lui a0, %hi(.Ltmp3)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    lw zero, %lo(.Ltmp3)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_o_with_local_1:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Ltmp3: # Block address taken
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi23:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_local_1:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Ltmp3: # Block address taken
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi23:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp3)(a0)
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp3)(a0)
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi22:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi22:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp30)(a0)
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp30)(a0)
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi22:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi220)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_1:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi22:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi220)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   br label %label
 
@@ -1382,47 +2026,89 @@ label:
 }
 
 define void @constraint_o_with_local_2() nounwind {
-; RV32I-LABEL: constraint_o_with_local_2:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:  .Ltmp4: # Block address taken
-; RV32I-NEXT:  # %bb.1: # %label
-; RV32I-NEXT:    lui a0, %hi(.Ltmp4+4)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_o_with_local_2:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:  .Ltmp4: # Block address taken
-; RV64I-NEXT:  # %bb.1: # %label
-; RV64I-NEXT:    lui a0, %hi(.Ltmp4+4)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_o_with_local_2:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Ltmp4: # Block address taken
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi24:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_local_2:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Ltmp4: # Block address taken
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi24:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi23:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi23:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp40+4)(a0)
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp40+4)(a0)
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi23:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi230)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_2:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi23:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi230)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   br label %label
 
@@ -1432,47 +2118,89 @@ label:
 }
 
 define void @constraint_o_with_local_3() nounwind {
-; RV32I-LABEL: constraint_o_with_local_3:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:  .Ltmp5: # Block address taken
-; RV32I-NEXT:  # %bb.1: # %label
-; RV32I-NEXT:    lui a0, %hi(.Ltmp5+2000)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_o_with_local_3:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:  .Ltmp5: # Block address taken
-; RV64I-NEXT:  # %bb.1: # %label
-; RV64I-NEXT:    lui a0, %hi(.Ltmp5+2000)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_o_with_local_3:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Ltmp5: # Block address taken
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi25:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi25)(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_o_with_local_3:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Ltmp5: # Block address taken
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi25:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi25)(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi24:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi24:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp50+2000)(a0)
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp50+2000)(a0)
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi24:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi240)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_3:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi24:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi240)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   br label %label
 
@@ -1584,9 +2312,9 @@ define void @constraint_A_with_global_1() nounwind {
 ;
 ; RV32I-MEDIUM-LABEL: constraint_A_with_global_1:
 ; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi26:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi25:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi26)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi25)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -1594,9 +2322,9 @@ define void @constraint_A_with_global_1() nounwind {
 ;
 ; RV64I-MEDIUM-LABEL: constraint_A_with_global_1:
 ; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi26:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi25:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi26)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi25)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP
@@ -1626,9 +2354,9 @@ define void @constraint_A_with_global_2() nounwind {
 ;
 ; RV32I-MEDIUM-LABEL: constraint_A_with_global_2:
 ; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi27:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi26:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi27)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi26)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -1636,9 +2364,9 @@ define void @constraint_A_with_global_2() nounwind {
 ;
 ; RV64I-MEDIUM-LABEL: constraint_A_with_global_2:
 ; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi27:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi26:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi27)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi26)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP
@@ -1668,9 +2396,9 @@ define void @constraint_A_with_global_3() nounwind {
 ;
 ; RV32I-MEDIUM-LABEL: constraint_A_with_global_3:
 ; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi28:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi27:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi28)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi27)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -1678,9 +2406,9 @@ define void @constraint_A_with_global_3() nounwind {
 ;
 ; RV64I-MEDIUM-LABEL: constraint_A_with_global_3:
 ; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi28:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi27:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi28)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi27)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP
@@ -1710,9 +2438,9 @@ define void @constraint_A_with_extern_weak_global_1() nounwind {
 ;
 ; RV32I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_1:
 ; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi29:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi28:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
-; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi29)(a0)
+; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi28)(a0)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -1720,9 +2448,9 @@ define void @constraint_A_with_extern_weak_global_1() nounwind {
 ;
 ; RV64I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_1:
 ; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi29:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi28:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
-; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi29)(a0)
+; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi28)(a0)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP
@@ -1752,9 +2480,9 @@ define void @constraint_A_with_extern_weak_global_2() nounwind {
 ;
 ; RV32I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_2:
 ; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi30:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi29:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
-; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi30)(a0)
+; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi29)(a0)
 ; RV32I-MEDIUM-NEXT:    addi a0, a0, 4
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
@@ -1763,9 +2491,9 @@ define void @constraint_A_with_extern_weak_global_2() nounwind {
 ;
 ; RV64I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_2:
 ; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi30:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi29:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
-; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi30)(a0)
+; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi29)(a0)
 ; RV64I-MEDIUM-NEXT:    addi a0, a0, 4
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
@@ -1796,9 +2524,9 @@ define void @constraint_A_with_extern_weak_global_3() nounwind {
 ;
 ; RV32I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_3:
 ; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi31:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi30:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
-; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi31)(a0)
+; RV32I-MEDIUM-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi30)(a0)
 ; RV32I-MEDIUM-NEXT:    lui a1, 2
 ; RV32I-MEDIUM-NEXT:    addi a1, a1, -192
 ; RV32I-MEDIUM-NEXT:    add a0, a0, a1
@@ -1809,9 +2537,9 @@ define void @constraint_A_with_extern_weak_global_3() nounwind {
 ;
 ; RV64I-MEDIUM-LABEL: constraint_A_with_extern_weak_global_3:
 ; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi31:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi30:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %got_pcrel_hi(ewg)
-; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi31)(a0)
+; RV64I-MEDIUM-NEXT:    ld a0, %pcrel_lo(.Lpcrel_hi30)(a0)
 ; RV64I-MEDIUM-NEXT:    lui a1, 2
 ; RV64I-MEDIUM-NEXT:    addiw a1, a1, -192
 ; RV64I-MEDIUM-NEXT:    add a0, a0, a1
@@ -1823,48 +2551,6 @@ define void @constraint_A_with_extern_weak_global_3() nounwind {
   ret void
 }
 
-define void @constraint_A_with_multi_operands() nounwind {
-; RV32I-LABEL: constraint_A_with_multi_operands:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    lui a0, %hi(eg)
-; RV32I-NEXT:    addi a0, a0, %lo(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_A_with_multi_operands:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    lui a0, %hi(eg)
-; RV64I-NEXT:    addi a0, a0, %lo(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_A_with_multi_operands:
-; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi32:
-; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi32)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_A_with_multi_operands:
-; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi32:
-; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi32)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, 0(a0) \n sw zero, 0(a0)
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:    ret
-  call void asm "sw zero, $0 \n sw zero, $1", "=*A,=*A"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg)
-  ret void
-}
-
 define void @constraint_A_with_multi_asm() nounwind {
 ; RV32I-LABEL: constraint_A_with_multi_asm:
 ; RV32I:       # %bb.0:
@@ -1892,9 +2578,9 @@ define void @constraint_A_with_multi_asm() nounwind {
 ;
 ; RV32I-MEDIUM-LABEL: constraint_A_with_multi_asm:
 ; RV32I-MEDIUM:       # %bb.0:
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi33:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi31:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi33)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi31)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -1905,9 +2591,9 @@ define void @constraint_A_with_multi_asm() nounwind {
 ;
 ; RV64I-MEDIUM-LABEL: constraint_A_with_multi_asm:
 ; RV64I-MEDIUM:       # %bb.0:
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi33:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi31:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi33)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi31)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    sw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP
@@ -1921,71 +2607,145 @@ define void @constraint_A_with_multi_asm() nounwind {
 }
 
 define i32 @constraint_A_with_callbr_multi_operands(i32 %a) {
-; RV32I-LABEL: constraint_A_with_callbr_multi_operands:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:    lui a1, %hi(eg)
-; RV32I-NEXT:    addi a1, a1, %lo(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB42_2
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.1: # %normal
-; RV32I-NEXT:    li a0, 0
-; RV32I-NEXT:    ret
-; RV32I-NEXT:  .LBB42_2: # Block address taken
-; RV32I-NEXT:    # %fail
-; RV32I-NEXT:    # Label of block must be emitted
-; RV32I-NEXT:    li a0, 1
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_A_with_callbr_multi_operands:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:    lui a1, %hi(eg)
-; RV64I-NEXT:    addi a1, a1, %lo(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB42_2
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.1: # %normal
-; RV64I-NEXT:    li a0, 0
-; RV64I-NEXT:    ret
-; RV64I-NEXT:  .LBB42_2: # Block address taken
-; RV64I-NEXT:    # %fail
-; RV64I-NEXT:    # Label of block must be emitted
-; RV64I-NEXT:    li a0, 1
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_A_with_callbr_multi_operands:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi34:
-; RV32I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi34)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB42_2
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %normal
-; RV32I-MEDIUM-NEXT:    li a0, 0
-; RV32I-MEDIUM-NEXT:    ret
-; RV32I-MEDIUM-NEXT:  .LBB42_2: # Block address taken
-; RV32I-MEDIUM-NEXT:    # %fail
-; RV32I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV32I-MEDIUM-NEXT:    li a0, 1
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_A_with_callbr_multi_operands:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi34:
-; RV64I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi34)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB42_2
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %normal
-; RV64I-MEDIUM-NEXT:    li a0, 0
-; RV64I-MEDIUM-NEXT:    ret
-; RV64I-MEDIUM-NEXT:  .LBB42_2: # Block address taken
-; RV64I-MEDIUM-NEXT:    # %fail
-; RV64I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV64I-MEDIUM-NEXT:    li a0, 1
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-NO-INTEGRATED-NEXT:    ret
+; RV32I-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-NO-INTEGRATED-NEXT:    ret
+; RV64I-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi32:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi32:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); sw zero, 0(a1); beqz a0, .LBB40_2
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB40_2
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-INTEGRATED-NEXT:    li a0, 0
+; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV32I-INTEGRATED-NEXT:    # %fail
+; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-INTEGRATED-NEXT:    li a0, 1
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB40_2
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-INTEGRATED-NEXT:    li a0, 0
+; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV64I-INTEGRATED-NEXT:    # %fail
+; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-INTEGRATED-NEXT:    li a0, 1
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi32:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB40_2
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_callbr_multi_operands:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi32:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi32)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB40_2
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB40_2: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   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]
 
@@ -1997,87 +2757,177 @@ fail:
 }
 
 define i32 @constraint_A_with_multi_callbr_asm(i32 %a) {
-; RV32I-LABEL: constraint_A_with_multi_callbr_asm:
-; RV32I:       # %bb.0: # %entry
-; RV32I-NEXT:    lui a1, %hi(eg)
-; RV32I-NEXT:    addi a1, a1, %lo(eg)
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.1: # %normal0
-; RV32I-NEXT:    #APP
-; RV32I-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV32I-NEXT:    #NO_APP
-; RV32I-NEXT:  # %bb.2: # %normal1
-; RV32I-NEXT:    li a0, 0
-; RV32I-NEXT:    ret
-; RV32I-NEXT:  .LBB43_3: # Block address taken
-; RV32I-NEXT:    # %fail
-; RV32I-NEXT:    # Label of block must be emitted
-; RV32I-NEXT:    li a0, 1
-; RV32I-NEXT:    ret
-;
-; RV64I-LABEL: constraint_A_with_multi_callbr_asm:
-; RV64I:       # %bb.0: # %entry
-; RV64I-NEXT:    lui a1, %hi(eg)
-; RV64I-NEXT:    addi a1, a1, %lo(eg)
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.1: # %normal0
-; RV64I-NEXT:    #APP
-; RV64I-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:  # %bb.2: # %normal1
-; RV64I-NEXT:    li a0, 0
-; RV64I-NEXT:    ret
-; RV64I-NEXT:  .LBB43_3: # Block address taken
-; RV64I-NEXT:    # %fail
-; RV64I-NEXT:    # Label of block must be emitted
-; RV64I-NEXT:    li a0, 1
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-LABEL: constraint_A_with_multi_callbr_asm:
-; RV32I-MEDIUM:       # %bb.0: # %entry
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi35:
-; RV32I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV32I-MEDIUM-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi35)
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.1: # %normal0
-; RV32I-MEDIUM-NEXT:    #APP
-; RV32I-MEDIUM-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV32I-MEDIUM-NEXT:    #NO_APP
-; RV32I-MEDIUM-NEXT:  # %bb.2: # %normal1
-; RV32I-MEDIUM-NEXT:    li a0, 0
-; RV32I-MEDIUM-NEXT:    ret
-; RV32I-MEDIUM-NEXT:  .LBB43_3: # Block address taken
-; RV32I-MEDIUM-NEXT:    # %fail
-; RV32I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV32I-MEDIUM-NEXT:    li a0, 1
-; RV32I-MEDIUM-NEXT:    ret
-;
-; RV64I-MEDIUM-LABEL: constraint_A_with_multi_callbr_asm:
-; RV64I-MEDIUM:       # %bb.0: # %entry
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi35:
-; RV64I-MEDIUM-NEXT:    auipc a1, %pcrel_hi(eg)
-; RV64I-MEDIUM-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi35)
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.1: # %normal0
-; RV64I-MEDIUM-NEXT:    #APP
-; RV64I-MEDIUM-NEXT:    sw zero, 0(a1); beqz a0, .LBB43_3
-; RV64I-MEDIUM-NEXT:    #NO_APP
-; RV64I-MEDIUM-NEXT:  # %bb.2: # %normal1
-; RV64I-MEDIUM-NEXT:    li a0, 0
-; RV64I-MEDIUM-NEXT:    ret
-; RV64I-MEDIUM-NEXT:  .LBB43_3: # Block address taken
-; RV64I-MEDIUM-NEXT:    # %fail
-; RV64I-MEDIUM-NEXT:    # Label of block must be emitted
-; RV64I-MEDIUM-NEXT:    li a0, 1
-; RV64I-MEDIUM-NEXT:    ret
+; RV32I-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-NO-INTEGRATED-NEXT:    #APP
+; RV32I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-NO-INTEGRATED-NEXT:    ret
+; RV32I-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV32I-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-NO-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-NO-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-NO-INTEGRATED-NEXT:    #APP
+; RV64I-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-NO-INTEGRATED-NEXT:    ret
+; RV64I-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV64I-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi33:
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi33:
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, 0(a1); beqz a0, .LBB41_3
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
+;
+; RV32I-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV32I-INTEGRATED:       # %bb.0: # %entry
+; RV32I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV32I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-INTEGRATED-NEXT:    #APP
+; RV32I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV32I-INTEGRATED-NEXT:    #NO_APP
+; RV32I-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-INTEGRATED-NEXT:    li a0, 0
+; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV32I-INTEGRATED-NEXT:    # %fail
+; RV32I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-INTEGRATED-NEXT:    li a0, 1
+; RV32I-INTEGRATED-NEXT:    ret
+;
+; RV64I-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV64I-INTEGRATED:       # %bb.0: # %entry
+; RV64I-INTEGRATED-NEXT:    lui a1, %hi(eg)
+; RV64I-INTEGRATED-NEXT:    addi a1, a1, %lo(eg)
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-INTEGRATED-NEXT:    #APP
+; RV64I-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV64I-INTEGRATED-NEXT:    #NO_APP
+; RV64I-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-INTEGRATED-NEXT:    li a0, 0
+; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV64I-INTEGRATED-NEXT:    # %fail
+; RV64I-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-INTEGRATED-NEXT:    li a0, 1
+; RV64I-INTEGRATED-NEXT:    ret
+;
+; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi33:
+; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV32I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV32I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+;
+; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_A_with_multi_callbr_asm:
+; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi33:
+; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    addi a1, a1, %pcrel_lo(.Lpcrel_hi33)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, 0(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB41_3
+; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
+; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 0
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-INTEGRATED-NEXT:  .LBB41_3: # Block address taken
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # %fail
+; RV64I-MEDIUM-INTEGRATED-NEXT:    # Label of block must be emitted
+; RV64I-MEDIUM-INTEGRATED-NEXT:    li a0, 1
+; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
 entry:
   callbr void asm "sw zero, $0; beqz $1, $2", "=*A,r,!i"(ptr elementtype(i32) @eg, i32 %a) to label %normal0 [label %fail]
 
@@ -2118,9 +2968,9 @@ define void @constraint_A_with_local_1() nounwind {
 ; RV32I-MEDIUM:       # %bb.0: # %entry
 ; RV32I-MEDIUM-NEXT:  .Ltmp6: # Block address taken
 ; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi36:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi34:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp6)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi36)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi34)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    lw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -2130,9 +2980,9 @@ define void @constraint_A_with_local_1() nounwind {
 ; RV64I-MEDIUM:       # %bb.0: # %entry
 ; RV64I-MEDIUM-NEXT:  .Ltmp6: # Block address taken
 ; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi36:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi34:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp6)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi36)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi34)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    lw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP
@@ -2172,9 +3022,9 @@ define void @constraint_A_with_local_2() nounwind {
 ; RV32I-MEDIUM:       # %bb.0: # %entry
 ; RV32I-MEDIUM-NEXT:  .Ltmp7: # Block address taken
 ; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi37:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi35:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp7+4)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi37)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi35)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    lw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -2184,9 +3034,9 @@ define void @constraint_A_with_local_2() nounwind {
 ; RV64I-MEDIUM:       # %bb.0: # %entry
 ; RV64I-MEDIUM-NEXT:  .Ltmp7: # Block address taken
 ; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi37:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi35:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp7+4)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi37)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi35)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    lw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP
@@ -2226,9 +3076,9 @@ define void @constraint_A_with_local_3() nounwind {
 ; RV32I-MEDIUM:       # %bb.0: # %entry
 ; RV32I-MEDIUM-NEXT:  .Ltmp8: # Block address taken
 ; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NEXT:  .Lpcrel_hi38:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi36:
 ; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp8+2000)
-; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi38)
+; RV32I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi36)
 ; RV32I-MEDIUM-NEXT:    #APP
 ; RV32I-MEDIUM-NEXT:    lw zero, 0(a0)
 ; RV32I-MEDIUM-NEXT:    #NO_APP
@@ -2238,9 +3088,9 @@ define void @constraint_A_with_local_3() nounwind {
 ; RV64I-MEDIUM:       # %bb.0: # %entry
 ; RV64I-MEDIUM-NEXT:  .Ltmp8: # Block address taken
 ; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NEXT:  .Lpcrel_hi38:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi36:
 ; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp8+2000)
-; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi38)
+; RV64I-MEDIUM-NEXT:    addi a0, a0, %pcrel_lo(.Lpcrel_hi36)
 ; RV64I-MEDIUM-NEXT:    #APP
 ; RV64I-MEDIUM-NEXT:    lw zero, 0(a0)
 ; RV64I-MEDIUM-NEXT:    #NO_APP

>From 7f7523459757a7d830c8ca1e8fe3ffd94cb26157 Mon Sep 17 00:00:00 2001
From: Anton Sidorenko <anton.sidorenko at syntacore.com>
Date: Fri, 16 Aug 2024 13:40:19 +0300
Subject: [PATCH 2/2] [RISCV] Mark symbols used in inline asm for relocations
 as referenced

Commit 5cd8d53cac00f taught RISCVMergeBaseOffset to handle inline asm, however
there is at least one case uncovered for integrated as.

In the example below compiler generates pcrel relocation (mcmodel=medany)
    volatile double double_val = 1.0;
    void foo() {
        asm volatile("fld f0, %0 \n\t" : : "m"(double_val) : "memory");
    }

And fails with the folliwng error
    error: could not find corresponding %pcrel_hi
          |       "fld f0, %0 \n\t"
    <inline asm>:1:2: note: instantiated into assembly here
          |         fld f0, %pcrel_lo(.Lpcrel_hi0)(a0)

After transformations MachineFunction contains inline asm instructions with
'.Lpcrel_hi0' symbol that is not defined in inline asm, but referenced.
   ... = AUIPC ...(riscv-pcrel-hi) @double_val, pre-instr-symbol <mcsymbol .Lpcrel_hi0>
   INLINEASM &"fld f0, $0 \0A\09" ... target-flags(riscv-pcrel-lo) <mcsymbol .Lpcrel_hi0>

So, when AsmParser processes 'fld', it has to create a new symbol as
'.Lpcrel_hi0' already exists but not known to be referenced in inline asm.
AsmParser avoids conflicts by renaming referenced by 'fld' symbol with
'.Lpcrel_hi00' name which does not exist. Resulting erroneous asm
    .Lpcrel_hi0:
        auipc   a0, %pcrel_hi(double_val)
        #APP
        fld     ft0, %pcrel_lo(.Lpcrel_hi00)(a0)

This change adds symbols used in memory operands to the list of referenced ones.
---
 llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp     |    9 +
 .../RISCV/inline-asm-mem-constraint.ll        | 1188 ++++++-----------
 2 files changed, 399 insertions(+), 798 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
index 93677433c04405..476dde2be39e57 100644
--- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
+++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
@@ -396,6 +396,15 @@ bool RISCVAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
     OS << MCO.getImm();
   else if (Offset.isGlobal() || Offset.isBlockAddress() || Offset.isMCSymbol())
     OS << *MCO.getExpr();
+
+  if (Offset.isMCSymbol())
+    MMI->getContext().registerInlineAsmLabel(Offset.getMCSymbol());
+  if (Offset.isBlockAddress()) {
+    const BlockAddress *BA = Offset.getBlockAddress();
+    MCSymbol *Sym = GetBlockAddressSymbol(BA);
+    MMI->getContext().registerInlineAsmLabel(Sym);
+  }
+
   OS << "(" << RISCVInstPrinter::getRegisterName(AddrReg.getReg()) << ")";
   return false;
 }
diff --git a/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll b/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll
index 85a1bd09377217..82798a22014ec6 100644
--- a/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll
+++ b/llvm/test/CodeGen/RISCV/inline-asm-mem-constraint.ll
@@ -129,41 +129,23 @@ define void @constraint_m_with_global_1() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_1:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_1:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_1:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi00)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_m_with_global_1:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi0:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_1:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi00)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_m_with_global_1:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi0:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi0)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
   ret void
 }
@@ -185,41 +167,23 @@ define void @constraint_m_with_global_2() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_2:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi1:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_2:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi1:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_2:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi1:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi110)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_m_with_global_2:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi1:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_2:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi1:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi110)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_m_with_global_2:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi1:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi1)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 1))
   ret void
 }
@@ -241,41 +205,23 @@ define void @constraint_m_with_global_3() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_3:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi2:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_global_3:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi2:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_3:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi2:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi210)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_m_with_global_3:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi2:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_global_3:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi2:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi210)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_m_with_global_3:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi2:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi2)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 2000))
   ret void
 }
@@ -407,89 +353,47 @@ define void @constraint_m_with_extern_weak_global_3() nounwind {
 }
 
 define void @constraint_m_with_local_1() nounwind {
-; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
-; RV32I-NO-INTEGRATED-NEXT:    #APP
-; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp0)(a0)
-; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
-; RV64I-NO-INTEGRATED-NEXT:    #APP
-; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp0)(a0)
-; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi6:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi6:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV32I-INTEGRATED:       # %bb.0: # %entry
-; RV32I-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
-; RV32I-INTEGRATED-NEXT:    #APP
-; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp00)(a0)
-; RV32I-INTEGRATED-NEXT:    #NO_APP
-; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-LABEL: constraint_m_with_local_1:
+; RV32I:       # %bb.0: # %entry
+; RV32I-NEXT:  .Ltmp0: # Block address taken
+; RV32I-NEXT:  # %bb.1: # %label
+; RV32I-NEXT:    lui a0, %hi(.Ltmp0)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    lw zero, %lo(.Ltmp0)(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
 ;
-; RV64I-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV64I-INTEGRATED:       # %bb.0: # %entry
-; RV64I-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp0)
-; RV64I-INTEGRATED-NEXT:    #APP
-; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp00)(a0)
-; RV64I-INTEGRATED-NEXT:    #NO_APP
-; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-LABEL: constraint_m_with_local_1:
+; RV64I:       # %bb.0: # %entry
+; RV64I-NEXT:  .Ltmp0: # Block address taken
+; RV64I-NEXT:  # %bb.1: # %label
+; RV64I-NEXT:    lui a0, %hi(.Ltmp0)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    lw zero, %lo(.Ltmp0)(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi6:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi60)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_m_with_local_1:
+; RV32I-MEDIUM:       # %bb.0: # %entry
+; RV32I-MEDIUM-NEXT:  .Ltmp0: # Block address taken
+; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi6:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_1:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp0: # Block address taken
-; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi6:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi60)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_m_with_local_1:
+; RV64I-MEDIUM:       # %bb.0: # %entry
+; RV64I-MEDIUM-NEXT:  .Ltmp0: # Block address taken
+; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi6:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp0)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi6)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
 entry:
   br label %label
 
@@ -499,89 +403,47 @@ label:
 }
 
 define void @constraint_m_with_local_2() nounwind {
-; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
-; RV32I-NO-INTEGRATED-NEXT:    #APP
-; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
-; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
-; RV64I-NO-INTEGRATED-NEXT:    #APP
-; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
-; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi7:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi7:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV32I-INTEGRATED:       # %bb.0: # %entry
-; RV32I-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
-; RV32I-INTEGRATED-NEXT:    #APP
-; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp10+4)(a0)
-; RV32I-INTEGRATED-NEXT:    #NO_APP
-; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-LABEL: constraint_m_with_local_2:
+; RV32I:       # %bb.0: # %entry
+; RV32I-NEXT:  .Ltmp1: # Block address taken
+; RV32I-NEXT:  # %bb.1: # %label
+; RV32I-NEXT:    lui a0, %hi(.Ltmp1+4)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
 ;
-; RV64I-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV64I-INTEGRATED:       # %bb.0: # %entry
-; RV64I-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp1+4)
-; RV64I-INTEGRATED-NEXT:    #APP
-; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp10+4)(a0)
-; RV64I-INTEGRATED-NEXT:    #NO_APP
-; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-LABEL: constraint_m_with_local_2:
+; RV64I:       # %bb.0: # %entry
+; RV64I-NEXT:  .Ltmp1: # Block address taken
+; RV64I-NEXT:  # %bb.1: # %label
+; RV64I-NEXT:    lui a0, %hi(.Ltmp1+4)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    lw zero, %lo(.Ltmp1+4)(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi7:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi70)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_m_with_local_2:
+; RV32I-MEDIUM:       # %bb.0: # %entry
+; RV32I-MEDIUM-NEXT:  .Ltmp1: # Block address taken
+; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi7:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_2:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp1: # Block address taken
-; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi7:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi70)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_m_with_local_2:
+; RV64I-MEDIUM:       # %bb.0: # %entry
+; RV64I-MEDIUM-NEXT:  .Ltmp1: # Block address taken
+; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi7:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp1+4)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi7)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
 entry:
   br label %label
 
@@ -591,89 +453,47 @@ label:
 }
 
 define void @constraint_m_with_local_3() nounwind {
-; RV32I-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
-; RV32I-NO-INTEGRATED-NEXT:    #APP
-; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
-; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
-; RV64I-NO-INTEGRATED-NEXT:    #APP
-; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
-; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi8:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi8:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV32I-INTEGRATED:       # %bb.0: # %entry
-; RV32I-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
-; RV32I-INTEGRATED-NEXT:    #APP
-; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp20+2000)(a0)
-; RV32I-INTEGRATED-NEXT:    #NO_APP
-; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-LABEL: constraint_m_with_local_3:
+; RV32I:       # %bb.0: # %entry
+; RV32I-NEXT:  .Ltmp2: # Block address taken
+; RV32I-NEXT:  # %bb.1: # %label
+; RV32I-NEXT:    lui a0, %hi(.Ltmp2+2000)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
 ;
-; RV64I-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV64I-INTEGRATED:       # %bb.0: # %entry
-; RV64I-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp2+2000)
-; RV64I-INTEGRATED-NEXT:    #APP
-; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp20+2000)(a0)
-; RV64I-INTEGRATED-NEXT:    #NO_APP
-; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-LABEL: constraint_m_with_local_3:
+; RV64I:       # %bb.0: # %entry
+; RV64I-NEXT:  .Ltmp2: # Block address taken
+; RV64I-NEXT:  # %bb.1: # %label
+; RV64I-NEXT:    lui a0, %hi(.Ltmp2+2000)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    lw zero, %lo(.Ltmp2+2000)(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi8:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi80)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_m_with_local_3:
+; RV32I-MEDIUM:       # %bb.0: # %entry
+; RV32I-MEDIUM-NEXT:  .Ltmp2: # Block address taken
+; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi8:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_local_3:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp2: # Block address taken
-; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi8:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi80)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_m_with_local_3:
+; RV64I-MEDIUM:       # %bb.0: # %entry
+; RV64I-MEDIUM-NEXT:  .Ltmp2: # Block address taken
+; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi8:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp2+2000)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi8)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
 entry:
   br label %label
 
@@ -740,8 +560,8 @@ define void @constraint_m_with_multi_operands() nounwind {
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi9:
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
 ;
@@ -750,8 +570,8 @@ define void @constraint_m_with_multi_operands() nounwind {
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi9:
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi90)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi9)(a0)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
   call void asm "sw zero, $0; sw zero, $1", "=*m,=*m"(ptr elementtype(i32) @eg, ptr elementtype(i32) @eg)
@@ -781,53 +601,29 @@ define void @constraint_m_with_multi_asm() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_asm:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi10:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_m_with_multi_asm:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi10:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_asm:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi10:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_m_with_multi_asm:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi10:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_m_with_multi_asm:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi10:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi100)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_m_with_multi_asm:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi10:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi10)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
   call void asm "sw zero, $0", "=*m"(ptr elementtype(i32) @eg)
   ret void
@@ -935,8 +731,8 @@ define i32 @constraint_m_with_callbr_multi_operands(i32 %a) {
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi11:
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB14_2
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
@@ -953,8 +749,8 @@ define i32 @constraint_m_with_callbr_multi_operands(i32 %a) {
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi11:
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi111)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi11)(a1)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB14_2
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
@@ -1101,12 +897,12 @@ define i32 @constraint_m_with_multi_callbr_asm(i32 %a) {
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi12:
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
@@ -1123,12 +919,12 @@ define i32 @constraint_m_with_multi_callbr_asm(i32 %a) {
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi12:
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi120)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi12)(a1)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB15_3
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
@@ -1262,41 +1058,23 @@ define void @constraint_o_with_global_1() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_1:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi13:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_1:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi13:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_1:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi13:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi130)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_o_with_global_1:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi13:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_1:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi13:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi130)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_o_with_global_1:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi13:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi13)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
   ret void
 }
@@ -1316,43 +1094,25 @@ define void @constraint_o_with_global_2() nounwind {
 ; RV64I-NEXT:    #APP
 ; RV64I-NEXT:    sw zero, %lo(eg+4)(a0)
 ; RV64I-NEXT:    #NO_APP
-; RV64I-NEXT:    ret
-;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_2:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi14:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_2:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi14:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_2:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi14:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi140)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_2:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi14:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+4)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi140)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_o_with_global_2:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi14:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
+;
+; RV64I-MEDIUM-LABEL: constraint_o_with_global_2:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi14:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+4)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi14)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 1))
   ret void
 }
@@ -1374,41 +1134,23 @@ define void @constraint_o_with_global_3() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_3:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi15:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_global_3:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi15:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_3:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi15:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi150)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_o_with_global_3:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi15:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_global_3:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi15:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg+8000)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi150)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_o_with_global_3:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi15:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg+8000)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi15)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) getelementptr ([400000 x i32], ptr @eg, i32 0, i32 2000))
   ret void
 }
@@ -1562,53 +1304,29 @@ define void @constraint_o_with_multi_asm() nounwind {
 ; RV64I-NEXT:    #NO_APP
 ; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_asm:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi19:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_multi_asm:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi19:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_asm:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi19:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_o_with_multi_asm:
+; RV32I-MEDIUM:       # %bb.0:
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi19:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_multi_asm:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0:
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi19:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(eg)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi190)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_o_with_multi_asm:
+; RV64I-MEDIUM:       # %bb.0:
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi19:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(eg)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi19)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
   call void asm "sw zero, $0", "=*o"(ptr elementtype(i32) @eg)
   ret void
@@ -1716,8 +1434,8 @@ define i32 @constraint_o_with_callbr_multi_operands(i32 %a) {
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi20:
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB26_2
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
@@ -1734,8 +1452,8 @@ define i32 @constraint_o_with_callbr_multi_operands(i32 %a) {
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi20:
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi200)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi20)(a1)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB26_2
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal
@@ -1882,12 +1600,12 @@ define i32 @constraint_o_with_multi_callbr_asm(i32 %a) {
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi21:
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV32I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
 ; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
@@ -1904,12 +1622,12 @@ define i32 @constraint_o_with_multi_callbr_asm(i32 %a) {
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi21:
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a1, %pcrel_hi(eg)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %normal0
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi211)(a1)
+; RV64I-MEDIUM-INTEGRATED-NEXT:    sw zero, %pcrel_lo(.Lpcrel_hi21)(a1)
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    beqz a0, .LBB27_3
 ; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
 ; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.2: # %normal1
@@ -1934,89 +1652,47 @@ fail:
 }
 
 define void @constraint_o_with_local_1() nounwind {
-; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
-; RV32I-NO-INTEGRATED-NEXT:    #APP
-; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp3)(a0)
-; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
-; RV64I-NO-INTEGRATED-NEXT:    #APP
-; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp3)(a0)
-; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi22:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi22:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV32I-INTEGRATED:       # %bb.0: # %entry
-; RV32I-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
-; RV32I-INTEGRATED-NEXT:    #APP
-; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp30)(a0)
-; RV32I-INTEGRATED-NEXT:    #NO_APP
-; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-LABEL: constraint_o_with_local_1:
+; RV32I:       # %bb.0: # %entry
+; RV32I-NEXT:  .Ltmp3: # Block address taken
+; RV32I-NEXT:  # %bb.1: # %label
+; RV32I-NEXT:    lui a0, %hi(.Ltmp3)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    lw zero, %lo(.Ltmp3)(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
 ;
-; RV64I-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV64I-INTEGRATED:       # %bb.0: # %entry
-; RV64I-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp3)
-; RV64I-INTEGRATED-NEXT:    #APP
-; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp30)(a0)
-; RV64I-INTEGRATED-NEXT:    #NO_APP
-; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-LABEL: constraint_o_with_local_1:
+; RV64I:       # %bb.0: # %entry
+; RV64I-NEXT:  .Ltmp3: # Block address taken
+; RV64I-NEXT:  # %bb.1: # %label
+; RV64I-NEXT:    lui a0, %hi(.Ltmp3)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    lw zero, %lo(.Ltmp3)(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi22:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi220)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_o_with_local_1:
+; RV32I-MEDIUM:       # %bb.0: # %entry
+; RV32I-MEDIUM-NEXT:  .Ltmp3: # Block address taken
+; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi22:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_1:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp3: # Block address taken
-; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi22:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi220)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_o_with_local_1:
+; RV64I-MEDIUM:       # %bb.0: # %entry
+; RV64I-MEDIUM-NEXT:  .Ltmp3: # Block address taken
+; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi22:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp3)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi22)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
 entry:
   br label %label
 
@@ -2026,89 +1702,47 @@ label:
 }
 
 define void @constraint_o_with_local_2() nounwind {
-; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
-; RV32I-NO-INTEGRATED-NEXT:    #APP
-; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
-; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
-; RV64I-NO-INTEGRATED-NEXT:    #APP
-; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
-; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi23:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi23:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV32I-INTEGRATED:       # %bb.0: # %entry
-; RV32I-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
-; RV32I-INTEGRATED-NEXT:    #APP
-; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp40+4)(a0)
-; RV32I-INTEGRATED-NEXT:    #NO_APP
-; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-LABEL: constraint_o_with_local_2:
+; RV32I:       # %bb.0: # %entry
+; RV32I-NEXT:  .Ltmp4: # Block address taken
+; RV32I-NEXT:  # %bb.1: # %label
+; RV32I-NEXT:    lui a0, %hi(.Ltmp4+4)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
 ;
-; RV64I-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV64I-INTEGRATED:       # %bb.0: # %entry
-; RV64I-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp4+4)
-; RV64I-INTEGRATED-NEXT:    #APP
-; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp40+4)(a0)
-; RV64I-INTEGRATED-NEXT:    #NO_APP
-; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-LABEL: constraint_o_with_local_2:
+; RV64I:       # %bb.0: # %entry
+; RV64I-NEXT:  .Ltmp4: # Block address taken
+; RV64I-NEXT:  # %bb.1: # %label
+; RV64I-NEXT:    lui a0, %hi(.Ltmp4+4)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    lw zero, %lo(.Ltmp4+4)(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi23:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi230)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_o_with_local_2:
+; RV32I-MEDIUM:       # %bb.0: # %entry
+; RV32I-MEDIUM-NEXT:  .Ltmp4: # Block address taken
+; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi23:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_2:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp4: # Block address taken
-; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi23:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi230)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_o_with_local_2:
+; RV64I-MEDIUM:       # %bb.0: # %entry
+; RV64I-MEDIUM-NEXT:  .Ltmp4: # Block address taken
+; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi23:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp4+4)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi23)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
 entry:
   br label %label
 
@@ -2118,89 +1752,47 @@ label:
 }
 
 define void @constraint_o_with_local_3() nounwind {
-; RV32I-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV32I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV32I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
-; RV32I-NO-INTEGRATED-NEXT:    #APP
-; RV32I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
-; RV32I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV64I-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV64I-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-NO-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
-; RV64I-NO-INTEGRATED-NEXT:    #APP
-; RV64I-NO-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
-; RV64I-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV32I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi24:
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV64I-MEDIUM-NO-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV64I-MEDIUM-NO-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:  .Lpcrel_hi24:
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-NO-INTEGRATED-NEXT:    ret
-;
-; RV32I-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV32I-INTEGRATED:       # %bb.0: # %entry
-; RV32I-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV32I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
-; RV32I-INTEGRATED-NEXT:    #APP
-; RV32I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp50+2000)(a0)
-; RV32I-INTEGRATED-NEXT:    #NO_APP
-; RV32I-INTEGRATED-NEXT:    ret
+; RV32I-LABEL: constraint_o_with_local_3:
+; RV32I:       # %bb.0: # %entry
+; RV32I-NEXT:  .Ltmp5: # Block address taken
+; RV32I-NEXT:  # %bb.1: # %label
+; RV32I-NEXT:    lui a0, %hi(.Ltmp5+2000)
+; RV32I-NEXT:    #APP
+; RV32I-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
+; RV32I-NEXT:    #NO_APP
+; RV32I-NEXT:    ret
 ;
-; RV64I-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV64I-INTEGRATED:       # %bb.0: # %entry
-; RV64I-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV64I-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-INTEGRATED-NEXT:    lui a0, %hi(.Ltmp5+2000)
-; RV64I-INTEGRATED-NEXT:    #APP
-; RV64I-INTEGRATED-NEXT:    lw zero, %lo(.Ltmp50+2000)(a0)
-; RV64I-INTEGRATED-NEXT:    #NO_APP
-; RV64I-INTEGRATED-NEXT:    ret
+; RV64I-LABEL: constraint_o_with_local_3:
+; RV64I:       # %bb.0: # %entry
+; RV64I-NEXT:  .Ltmp5: # Block address taken
+; RV64I-NEXT:  # %bb.1: # %label
+; RV64I-NEXT:    lui a0, %hi(.Ltmp5+2000)
+; RV64I-NEXT:    #APP
+; RV64I-NEXT:    lw zero, %lo(.Ltmp5+2000)(a0)
+; RV64I-NEXT:    #NO_APP
+; RV64I-NEXT:    ret
 ;
-; RV32I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV32I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV32I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV32I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi24:
-; RV32I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi240)(a0)
-; RV32I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV32I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV32I-MEDIUM-LABEL: constraint_o_with_local_3:
+; RV32I-MEDIUM:       # %bb.0: # %entry
+; RV32I-MEDIUM-NEXT:  .Ltmp5: # Block address taken
+; RV32I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV32I-MEDIUM-NEXT:  .Lpcrel_hi24:
+; RV32I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
+; RV32I-MEDIUM-NEXT:    #APP
+; RV32I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
+; RV32I-MEDIUM-NEXT:    #NO_APP
+; RV32I-MEDIUM-NEXT:    ret
 ;
-; RV64I-MEDIUM-INTEGRATED-LABEL: constraint_o_with_local_3:
-; RV64I-MEDIUM-INTEGRATED:       # %bb.0: # %entry
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Ltmp5: # Block address taken
-; RV64I-MEDIUM-INTEGRATED-NEXT:  # %bb.1: # %label
-; RV64I-MEDIUM-INTEGRATED-NEXT:  .Lpcrel_hi24:
-; RV64I-MEDIUM-INTEGRATED-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi240)(a0)
-; RV64I-MEDIUM-INTEGRATED-NEXT:    #NO_APP
-; RV64I-MEDIUM-INTEGRATED-NEXT:    ret
+; RV64I-MEDIUM-LABEL: constraint_o_with_local_3:
+; RV64I-MEDIUM:       # %bb.0: # %entry
+; RV64I-MEDIUM-NEXT:  .Ltmp5: # Block address taken
+; RV64I-MEDIUM-NEXT:  # %bb.1: # %label
+; RV64I-MEDIUM-NEXT:  .Lpcrel_hi24:
+; RV64I-MEDIUM-NEXT:    auipc a0, %pcrel_hi(.Ltmp5+2000)
+; RV64I-MEDIUM-NEXT:    #APP
+; RV64I-MEDIUM-NEXT:    lw zero, %pcrel_lo(.Lpcrel_hi24)(a0)
+; RV64I-MEDIUM-NEXT:    #NO_APP
+; RV64I-MEDIUM-NEXT:    ret
 entry:
   br label %label
 



More information about the llvm-commits mailing list