llvm/llvm/test/CodeGen/Mips/GlobalISel/regbankselect/long_ambiguous_chain_s64.mir

# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -O0 -mtriple=mipsel-linux-gnu -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=MIPS32
--- |

  define void @long_chain_ambiguous_i64_in_fpr(i1 %cnd0, i1 %cnd1, i1 %cnd2, ptr %a, ptr %b, ptr %c, ptr %result) {
  entry:
    br i1 %cnd0, label %pre.PHI.2, label %pre.PHI.1

  pre.PHI.1:                                        ; preds = %entry
    br i1 %cnd1, label %b.PHI.1.1, label %pre.PHI.1.0

  pre.PHI.1.0:                                      ; preds = %pre.PHI.1
    br i1 %cnd2, label %b.PHI.1.2, label %b.PHI.1.0

  b.PHI.1.0:                                        ; preds = %pre.PHI.1.0
    %phi1.0 = load i64, ptr %a
    br label %b.PHI.1

  b.PHI.1.1:                                        ; preds = %pre.PHI.1
    %phi1.1 = load i64, ptr %b
    br label %b.PHI.1

  b.PHI.1.2:                                        ; preds = %pre.PHI.1.0
    %phi1.2 = load i64, ptr %c
    br label %b.PHI.1

  b.PHI.1:                                          ; preds = %b.PHI.1.2, %b.PHI.1.1, %b.PHI.1.0
    %phi1 = phi i64 [ %phi1.0, %b.PHI.1.0 ], [ %phi1.1, %b.PHI.1.1 ], [ %phi1.2, %b.PHI.1.2 ]
    br i1 %cnd2, label %b.PHI.1.end, label %b.PHI.3

  b.PHI.1.end:                                      ; preds = %b.PHI.1
    store i64 %phi1, ptr %result
    ret void

  pre.PHI.2:                                        ; preds = %entry
    br i1 %cnd0, label %b.PHI.2.0, label %b.PHI.2.1

  b.PHI.2.0:                                        ; preds = %pre.PHI.2
    %phi2.0 = load i64, ptr %a
    br label %b.PHI.2

  b.PHI.2.1:                                        ; preds = %pre.PHI.2
    %phi2.1 = load i64, ptr %b
    br label %b.PHI.2

  b.PHI.2:                                          ; preds = %b.PHI.2.1, %b.PHI.2.0
    %phi2 = phi i64 [ %phi2.0, %b.PHI.2.0 ], [ %phi2.1, %b.PHI.2.1 ]
    br i1 %cnd1, label %b.PHI.3, label %b.PHI.2.end

  b.PHI.2.end:                                      ; preds = %b.PHI.2
    store i64 %phi2, ptr %result
    ret void

  b.PHI.3:                                          ; preds = %b.PHI.2, %b.PHI.1
    %phi3 = phi i64 [ %phi2, %b.PHI.2 ], [ %phi1, %b.PHI.1 ]
    %phi4 = phi i64 [ %phi2, %b.PHI.2 ], [ %phi1, %b.PHI.1 ]
    %sel_1.2 = select i1 %cnd2, i64 %phi3, i64 %phi4
    %sel_3_1.2 = select i1 %cnd1, i64 %sel_1.2, i64 %phi3
    store i64 %sel_3_1.2, ptr %result
    store i64 %phi3, ptr %result
    ret void
  }

  define void @long_chain_i64_in_gpr(i1 %cnd0, i1 %cnd1, i1 %cnd2, ptr %a, ptr %b, ptr %c, ptr %result) {
  entry:
    br i1 %cnd0, label %pre.PHI.2, label %pre.PHI.1

  pre.PHI.1:                                        ; preds = %entry
    br i1 %cnd1, label %b.PHI.1.1, label %pre.PHI.1.0

  pre.PHI.1.0:                                      ; preds = %pre.PHI.1
    br i1 %cnd2, label %b.PHI.1.2, label %b.PHI.1.0

  b.PHI.1.0:                                        ; preds = %pre.PHI.1.0
    %phi1.0 = load i64, ptr %a
    br label %b.PHI.1

  b.PHI.1.1:                                        ; preds = %pre.PHI.1
    %phi1.1 = load i64, ptr %b
    br label %b.PHI.1

  b.PHI.1.2:                                        ; preds = %pre.PHI.1.0
    %phi1.2 = load i64, ptr %c
    br label %b.PHI.1

  b.PHI.1:                                          ; preds = %b.PHI.1.2, %b.PHI.1.1, %b.PHI.1.0
    %phi1 = phi i64 [ %phi1.0, %b.PHI.1.0 ], [ %phi1.1, %b.PHI.1.1 ], [ %phi1.2, %b.PHI.1.2 ]
    br i1 %cnd2, label %b.PHI.1.end, label %b.PHI.3

  b.PHI.1.end:                                      ; preds = %b.PHI.1
    store i64 %phi1, ptr %result
    ret void

  pre.PHI.2:                                        ; preds = %entry
    br i1 %cnd0, label %b.PHI.2.0, label %b.PHI.2.1

  b.PHI.2.0:                                        ; preds = %pre.PHI.2
    %phi2.0 = load i64, ptr %a
    br label %b.PHI.2

  b.PHI.2.1:                                        ; preds = %pre.PHI.2
    %phi2.1 = load i64, ptr %b
    br label %b.PHI.2

  b.PHI.2:                                          ; preds = %b.PHI.2.1, %b.PHI.2.0
    %phi2 = phi i64 [ %phi2.0, %b.PHI.2.0 ], [ %phi2.1, %b.PHI.2.1 ]
    br i1 %cnd1, label %b.PHI.3, label %b.PHI.2.end

  b.PHI.2.end:                                      ; preds = %b.PHI.2
    store i64 %phi2, ptr %result
    ret void

  b.PHI.3:                                          ; preds = %b.PHI.2, %b.PHI.1
    %phi3 = phi i64 [ %phi2, %b.PHI.2 ], [ %phi1, %b.PHI.1 ]
    %phi4 = phi i64 [ %phi2, %b.PHI.2 ], [ 0, %b.PHI.1 ]
    %sel_1.2 = select i1 %cnd2, i64 %phi3, i64 %phi4
    %sel_3_1.2 = select i1 %cnd1, i64 %sel_1.2, i64 %phi3
    store i64 %sel_3_1.2, ptr %result
    store i64 %phi3, ptr %result
    ret void
  }

  define void @long_chain_ambiguous_double_in_fpr(i1 %cnd0, i1 %cnd1, i1 %cnd2, ptr %a, ptr %b, ptr %c, ptr %result) {
  entry:
    br i1 %cnd0, label %pre.PHI.2, label %pre.PHI.1

  pre.PHI.1:                                        ; preds = %entry
    br i1 %cnd1, label %b.PHI.1.1, label %pre.PHI.1.0

  pre.PHI.1.0:                                      ; preds = %pre.PHI.1
    br i1 %cnd2, label %b.PHI.1.2, label %b.PHI.1.0

  b.PHI.1.0:                                        ; preds = %pre.PHI.1.0
    %phi1.0 = load double, ptr %a
    br label %b.PHI.1

  b.PHI.1.1:                                        ; preds = %pre.PHI.1
    %phi1.1 = load double, ptr %b
    br label %b.PHI.1

  b.PHI.1.2:                                        ; preds = %pre.PHI.1.0
    %phi1.2 = load double, ptr %c
    br label %b.PHI.1

  b.PHI.1:                                          ; preds = %b.PHI.1.2, %b.PHI.1.1, %b.PHI.1.0
    %phi1 = phi double [ %phi1.0, %b.PHI.1.0 ], [ %phi1.1, %b.PHI.1.1 ], [ %phi1.2, %b.PHI.1.2 ]
    br i1 %cnd2, label %b.PHI.1.end, label %b.PHI.3

  b.PHI.1.end:                                      ; preds = %b.PHI.1
    store double %phi1, ptr %result
    ret void

  pre.PHI.2:                                        ; preds = %entry
    br i1 %cnd0, label %b.PHI.2.0, label %b.PHI.2.1

  b.PHI.2.0:                                        ; preds = %pre.PHI.2
    %phi2.0 = load double, ptr %a
    br label %b.PHI.2

  b.PHI.2.1:                                        ; preds = %pre.PHI.2
    %phi2.1 = load double, ptr %b
    br label %b.PHI.2

  b.PHI.2:                                          ; preds = %b.PHI.2.1, %b.PHI.2.0
    %phi2 = phi double [ %phi2.0, %b.PHI.2.0 ], [ %phi2.1, %b.PHI.2.1 ]
    br i1 %cnd1, label %b.PHI.3, label %b.PHI.2.end

  b.PHI.2.end:                                      ; preds = %b.PHI.2
    store double %phi2, ptr %result
    ret void

  b.PHI.3:                                          ; preds = %b.PHI.2, %b.PHI.1
    %phi3 = phi double [ %phi2, %b.PHI.2 ], [ %phi1, %b.PHI.1 ]
    %phi4 = phi double [ %phi2, %b.PHI.2 ], [ %phi1, %b.PHI.1 ]
    %sel_1.2 = select i1 %cnd2, double %phi3, double %phi4
    %sel_3_1.2 = select i1 %cnd1, double %sel_1.2, double %phi3
    store double %sel_3_1.2, ptr %result
    store double %phi3, ptr %result
    ret void
  }

  define void @long_chain_double_in_fpr(i1 %cnd0, i1 %cnd1, i1 %cnd2, ptr %a, ptr %b, ptr %c, ptr %result) {
  entry:
    br i1 %cnd0, label %pre.PHI.2, label %pre.PHI.1

  pre.PHI.1:                                        ; preds = %entry
    br i1 %cnd1, label %b.PHI.1.1, label %pre.PHI.1.0

  pre.PHI.1.0:                                      ; preds = %pre.PHI.1
    br i1 %cnd2, label %b.PHI.1.2, label %b.PHI.1.0

  b.PHI.1.0:                                        ; preds = %pre.PHI.1.0
    %phi1.0 = load double, ptr %a
    br label %b.PHI.1

  b.PHI.1.1:                                        ; preds = %pre.PHI.1
    %phi1.1 = load double, ptr %b
    br label %b.PHI.1

  b.PHI.1.2:                                        ; preds = %pre.PHI.1.0
    %phi1.2 = load double, ptr %c
    br label %b.PHI.1

  b.PHI.1:                                          ; preds = %b.PHI.1.2, %b.PHI.1.1, %b.PHI.1.0
    %phi1 = phi double [ %phi1.0, %b.PHI.1.0 ], [ %phi1.1, %b.PHI.1.1 ], [ %phi1.2, %b.PHI.1.2 ]
    br i1 %cnd2, label %b.PHI.1.end, label %b.PHI.3

  b.PHI.1.end:                                      ; preds = %b.PHI.1
    store double %phi1, ptr %result
    ret void

  pre.PHI.2:                                        ; preds = %entry
    br i1 %cnd0, label %b.PHI.2.0, label %b.PHI.2.1

  b.PHI.2.0:                                        ; preds = %pre.PHI.2
    %phi2.0 = load double, ptr %a
    br label %b.PHI.2

  b.PHI.2.1:                                        ; preds = %pre.PHI.2
    %phi2.1 = load double, ptr %b
    br label %b.PHI.2

  b.PHI.2:                                          ; preds = %b.PHI.2.1, %b.PHI.2.0
    %phi2 = phi double [ %phi2.0, %b.PHI.2.0 ], [ %phi2.1, %b.PHI.2.1 ]
    br i1 %cnd1, label %b.PHI.3, label %b.PHI.2.end

  b.PHI.2.end:                                      ; preds = %b.PHI.2
    store double %phi2, ptr %result
    ret void

  b.PHI.3:                                          ; preds = %b.PHI.2, %b.PHI.1
    %phi3 = phi double [ %phi2, %b.PHI.2 ], [ %phi1, %b.PHI.1 ]
    %phi4 = phi double [ %phi2, %b.PHI.2 ], [ 0.000000e+00, %b.PHI.1 ]
    %sel_1.2 = select i1 %cnd2, double %phi3, double %phi4
    %sel_3_1.2 = select i1 %cnd1, double %sel_1.2, double %phi3
    store double %sel_3_1.2, ptr %result
    store double %phi3, ptr %result
    ret void
  }

...
---
name:            long_chain_ambiguous_i64_in_fpr
alignment:       4
legalized:       true
tracksRegLiveness: true
fixedStack:
  - { id: 0, offset: 24, size: 4, alignment: 8, isImmutable: true }
  - { id: 1, offset: 20, size: 4, alignment: 4, isImmutable: true }
  - { id: 2, offset: 16, size: 4, alignment: 8, isImmutable: true }
body:             |
  ; MIPS32-LABEL: name: long_chain_ambiguous_i64_in_fpr
  ; MIPS32: bb.0.entry:
  ; MIPS32:   successors: %bb.8(0x40000000), %bb.1(0x40000000)
  ; MIPS32:   liveins: $a0, $a1, $a2, $a3
  ; MIPS32:   [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
  ; MIPS32:   [[COPY1:%[0-9]+]]:gprb(s32) = COPY $a1
  ; MIPS32:   [[COPY2:%[0-9]+]]:gprb(s32) = COPY $a2
  ; MIPS32:   [[COPY3:%[0-9]+]]:gprb(p0) = COPY $a3
  ; MIPS32:   [[FRAME_INDEX:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.0
  ; MIPS32:   [[LOAD:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (load (p0) from %fixed-stack.0, align 8)
  ; MIPS32:   [[FRAME_INDEX1:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.1
  ; MIPS32:   [[LOAD1:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (p0) from %fixed-stack.1)
  ; MIPS32:   [[FRAME_INDEX2:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.2
  ; MIPS32:   [[LOAD2:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX2]](p0) :: (load (p0) from %fixed-stack.2, align 8)
  ; MIPS32:   [[C:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY4:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND:%[0-9]+]]:gprb(s32) = G_AND [[COPY4]], [[C]]
  ; MIPS32:   G_BRCOND [[AND]](s32), %bb.8
  ; MIPS32: bb.1.pre.PHI.1:
  ; MIPS32:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
  ; MIPS32:   [[C1:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY5:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND1:%[0-9]+]]:gprb(s32) = G_AND [[COPY5]], [[C1]]
  ; MIPS32:   G_BRCOND [[AND1]](s32), %bb.4
  ; MIPS32: bb.2.pre.PHI.1.0:
  ; MIPS32:   successors: %bb.5(0x40000000), %bb.3(0x40000000)
  ; MIPS32:   [[C2:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY6:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND2:%[0-9]+]]:gprb(s32) = G_AND [[COPY6]], [[C2]]
  ; MIPS32:   G_BRCOND [[AND2]](s32), %bb.5
  ; MIPS32: bb.3.b.PHI.1.0:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD3:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY3]](p0) :: (load (s64) from %ir.a)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.4.b.PHI.1.1:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD4:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD]](p0) :: (load (s64) from %ir.b)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.5.b.PHI.1.2:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD5:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD1]](p0) :: (load (s64) from %ir.c)
  ; MIPS32: bb.6.b.PHI.1:
  ; MIPS32:   successors: %bb.7(0x40000000), %bb.13(0x40000000)
  ; MIPS32:   [[PHI:%[0-9]+]]:fprb(s64) = G_PHI [[LOAD3]](s64), %bb.3, [[LOAD4]](s64), %bb.4, [[LOAD5]](s64), %bb.5
  ; MIPS32:   [[C3:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY7:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND3:%[0-9]+]]:gprb(s32) = G_AND [[COPY7]], [[C3]]
  ; MIPS32:   G_BRCOND [[AND3]](s32), %bb.7
  ; MIPS32:   G_BR %bb.13
  ; MIPS32: bb.7.b.PHI.1.end:
  ; MIPS32:   G_STORE [[PHI]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  ; MIPS32: bb.8.pre.PHI.2:
  ; MIPS32:   successors: %bb.9(0x40000000), %bb.10(0x40000000)
  ; MIPS32:   [[C4:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY8:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND4:%[0-9]+]]:gprb(s32) = G_AND [[COPY8]], [[C4]]
  ; MIPS32:   G_BRCOND [[AND4]](s32), %bb.9
  ; MIPS32:   G_BR %bb.10
  ; MIPS32: bb.9.b.PHI.2.0:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD6:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY3]](p0) :: (load (s64) from %ir.a)
  ; MIPS32:   G_BR %bb.11
  ; MIPS32: bb.10.b.PHI.2.1:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD7:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD]](p0) :: (load (s64) from %ir.b)
  ; MIPS32: bb.11.b.PHI.2:
  ; MIPS32:   successors: %bb.13(0x40000000), %bb.12(0x40000000)
  ; MIPS32:   [[PHI1:%[0-9]+]]:fprb(s64) = G_PHI [[LOAD6]](s64), %bb.9, [[LOAD7]](s64), %bb.10
  ; MIPS32:   [[C5:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY9:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND5:%[0-9]+]]:gprb(s32) = G_AND [[COPY9]], [[C5]]
  ; MIPS32:   G_BRCOND [[AND5]](s32), %bb.13
  ; MIPS32: bb.12.b.PHI.2.end:
  ; MIPS32:   G_STORE [[PHI1]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  ; MIPS32: bb.13.b.PHI.3:
  ; MIPS32:   [[PHI2:%[0-9]+]]:fprb(s64) = G_PHI [[PHI1]](s64), %bb.11, [[PHI]](s64), %bb.6
  ; MIPS32:   [[PHI3:%[0-9]+]]:fprb(s64) = G_PHI [[PHI1]](s64), %bb.11, [[PHI]](s64), %bb.6
  ; MIPS32:   [[C6:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY10:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND6:%[0-9]+]]:gprb(s32) = G_AND [[COPY10]], [[C6]]
  ; MIPS32:   [[SELECT:%[0-9]+]]:fprb(s64) = G_SELECT [[AND6]](s32), [[PHI2]], [[PHI3]]
  ; MIPS32:   [[COPY11:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND7:%[0-9]+]]:gprb(s32) = G_AND [[COPY11]], [[C6]]
  ; MIPS32:   [[SELECT1:%[0-9]+]]:fprb(s64) = G_SELECT [[AND7]](s32), [[SELECT]], [[PHI2]]
  ; MIPS32:   G_STORE [[SELECT1]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   G_STORE [[PHI2]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  bb.1.entry:
    liveins: $a0, $a1, $a2, $a3

    %7:_(s32) = COPY $a0
    %8:_(s32) = COPY $a1
    %9:_(s32) = COPY $a2
    %3:_(p0) = COPY $a3
    %10:_(p0) = G_FRAME_INDEX %fixed-stack.2
    %4:_(p0) = G_LOAD %10(p0) :: (load (p0) from %fixed-stack.2, align 8)
    %11:_(p0) = G_FRAME_INDEX %fixed-stack.1
    %5:_(p0) = G_LOAD %11(p0) :: (load (p0) from %fixed-stack.1)
    %12:_(p0) = G_FRAME_INDEX %fixed-stack.0
    %6:_(p0) = G_LOAD %12(p0) :: (load (p0) from %fixed-stack.0, align 8)
    %32:_(s32) = G_CONSTANT i32 1
    %33:_(s32) = COPY %7(s32)
    %31:_(s32) = G_AND %33, %32
    G_BRCOND %31(s32), %bb.9

  bb.2.pre.PHI.1:
    %34:_(s32) = G_CONSTANT i32 1
    %35:_(s32) = COPY %8(s32)
    %30:_(s32) = G_AND %35, %34
    G_BRCOND %30(s32), %bb.5

  bb.3.pre.PHI.1.0:
    %36:_(s32) = G_CONSTANT i32 1
    %37:_(s32) = COPY %9(s32)
    %29:_(s32) = G_AND %37, %36
    G_BRCOND %29(s32), %bb.6

  bb.4.b.PHI.1.0:
    %13:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.7

  bb.5.b.PHI.1.1:
    %15:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)
    G_BR %bb.7

  bb.6.b.PHI.1.2:
    %14:_(s64) = G_LOAD %5(p0) :: (load (s64) from %ir.c)

  bb.7.b.PHI.1:
    %16:_(s64) = G_PHI %13(s64), %bb.4, %15(s64), %bb.5, %14(s64), %bb.6
    %38:_(s32) = G_CONSTANT i32 1
    %39:_(s32) = COPY %9(s32)
    %28:_(s32) = G_AND %39, %38
    G_BRCOND %28(s32), %bb.8
    G_BR %bb.14

  bb.8.b.PHI.1.end:
    G_STORE %16(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.9.pre.PHI.2:
    %40:_(s32) = G_CONSTANT i32 1
    %41:_(s32) = COPY %7(s32)
    %27:_(s32) = G_AND %41, %40
    G_BRCOND %27(s32), %bb.10
    G_BR %bb.11

  bb.10.b.PHI.2.0:
    %18:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.12

  bb.11.b.PHI.2.1:
    %17:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)

  bb.12.b.PHI.2:
    %19:_(s64) = G_PHI %18(s64), %bb.10, %17(s64), %bb.11
    %42:_(s32) = G_CONSTANT i32 1
    %43:_(s32) = COPY %8(s32)
    %26:_(s32) = G_AND %43, %42
    G_BRCOND %26(s32), %bb.14

  bb.13.b.PHI.2.end:
    G_STORE %19(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.14.b.PHI.3:
    %20:_(s64) = G_PHI %19(s64), %bb.12, %16(s64), %bb.7
    %21:_(s64) = G_PHI %19(s64), %bb.12, %16(s64), %bb.7
    %44:_(s32) = G_CONSTANT i32 1
    %45:_(s32) = COPY %9(s32)
    %25:_(s32) = G_AND %45, %44
    %22:_(s64) = G_SELECT %25(s32), %20, %21
    %46:_(s32) = COPY %8(s32)
    %24:_(s32) = G_AND %46, %44
    %23:_(s64) = G_SELECT %24(s32), %22, %20
    G_STORE %23(s64), %6(p0) :: (store (s64) into %ir.result)
    G_STORE %20(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

...
---
name:            long_chain_i64_in_gpr
alignment:       4
legalized:       true
tracksRegLiveness: true
fixedStack:
  - { id: 0, offset: 24, size: 4, alignment: 8, isImmutable: true }
  - { id: 1, offset: 20, size: 4, alignment: 4, isImmutable: true }
  - { id: 2, offset: 16, size: 4, alignment: 8, isImmutable: true }
body:             |
  ; MIPS32-LABEL: name: long_chain_i64_in_gpr
  ; MIPS32: bb.0.entry:
  ; MIPS32:   successors: %bb.8(0x40000000), %bb.1(0x40000000)
  ; MIPS32:   liveins: $a0, $a1, $a2, $a3
  ; MIPS32:   [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
  ; MIPS32:   [[COPY1:%[0-9]+]]:gprb(s32) = COPY $a1
  ; MIPS32:   [[COPY2:%[0-9]+]]:gprb(s32) = COPY $a2
  ; MIPS32:   [[COPY3:%[0-9]+]]:gprb(p0) = COPY $a3
  ; MIPS32:   [[FRAME_INDEX:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.0
  ; MIPS32:   [[LOAD:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (load (p0) from %fixed-stack.0, align 8)
  ; MIPS32:   [[FRAME_INDEX1:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.1
  ; MIPS32:   [[LOAD1:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (p0) from %fixed-stack.1)
  ; MIPS32:   [[FRAME_INDEX2:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.2
  ; MIPS32:   [[LOAD2:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX2]](p0) :: (load (p0) from %fixed-stack.2, align 8)
  ; MIPS32:   [[C:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 0
  ; MIPS32:   [[C1:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY4:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND:%[0-9]+]]:gprb(s32) = G_AND [[COPY4]], [[C1]]
  ; MIPS32:   G_BRCOND [[AND]](s32), %bb.8
  ; MIPS32: bb.1.pre.PHI.1:
  ; MIPS32:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
  ; MIPS32:   [[C2:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY5:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND1:%[0-9]+]]:gprb(s32) = G_AND [[COPY5]], [[C2]]
  ; MIPS32:   G_BRCOND [[AND1]](s32), %bb.4
  ; MIPS32: bb.2.pre.PHI.1.0:
  ; MIPS32:   successors: %bb.5(0x40000000), %bb.3(0x40000000)
  ; MIPS32:   [[C3:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY6:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND2:%[0-9]+]]:gprb(s32) = G_AND [[COPY6]], [[C3]]
  ; MIPS32:   G_BRCOND [[AND2]](s32), %bb.5
  ; MIPS32: bb.3.b.PHI.1.0:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD3:%[0-9]+]]:gprb(s32) = G_LOAD [[COPY3]](p0) :: (load (s32) from %ir.a, align 8)
  ; MIPS32:   [[C4:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[COPY3]], [[C4]](s32)
  ; MIPS32:   [[LOAD4:%[0-9]+]]:gprb(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s32) from %ir.a + 4, basealign 8)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.4.b.PHI.1.1:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD5:%[0-9]+]]:gprb(s32) = G_LOAD [[LOAD]](p0) :: (load (s32) from %ir.b, align 8)
  ; MIPS32:   [[C5:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD1:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[LOAD]], [[C5]](s32)
  ; MIPS32:   [[LOAD6:%[0-9]+]]:gprb(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s32) from %ir.b + 4, basealign 8)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.5.b.PHI.1.2:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD7:%[0-9]+]]:gprb(s32) = G_LOAD [[LOAD1]](p0) :: (load (s32) from %ir.c, align 8)
  ; MIPS32:   [[C6:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD2:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[LOAD1]], [[C6]](s32)
  ; MIPS32:   [[LOAD8:%[0-9]+]]:gprb(s32) = G_LOAD [[PTR_ADD2]](p0) :: (load (s32) from %ir.c + 4, basealign 8)
  ; MIPS32: bb.6.b.PHI.1:
  ; MIPS32:   successors: %bb.7(0x40000000), %bb.13(0x40000000)
  ; MIPS32:   [[PHI:%[0-9]+]]:gprb(s32) = G_PHI [[LOAD3]](s32), %bb.3, [[LOAD5]](s32), %bb.4, [[LOAD7]](s32), %bb.5
  ; MIPS32:   [[PHI1:%[0-9]+]]:gprb(s32) = G_PHI [[LOAD4]](s32), %bb.3, [[LOAD6]](s32), %bb.4, [[LOAD8]](s32), %bb.5
  ; MIPS32:   [[C7:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY7:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND3:%[0-9]+]]:gprb(s32) = G_AND [[COPY7]], [[C7]]
  ; MIPS32:   G_BRCOND [[AND3]](s32), %bb.7
  ; MIPS32:   G_BR %bb.13
  ; MIPS32: bb.7.b.PHI.1.end:
  ; MIPS32:   G_STORE [[PHI]](s32), [[LOAD2]](p0) :: (store (s32) into %ir.result, align 8)
  ; MIPS32:   [[C8:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD3:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[LOAD2]], [[C8]](s32)
  ; MIPS32:   G_STORE [[PHI1]](s32), [[PTR_ADD3]](p0) :: (store (s32) into %ir.result + 4, basealign 8)
  ; MIPS32:   RetRA
  ; MIPS32: bb.8.pre.PHI.2:
  ; MIPS32:   successors: %bb.9(0x40000000), %bb.10(0x40000000)
  ; MIPS32:   [[C9:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY8:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND4:%[0-9]+]]:gprb(s32) = G_AND [[COPY8]], [[C9]]
  ; MIPS32:   G_BRCOND [[AND4]](s32), %bb.9
  ; MIPS32:   G_BR %bb.10
  ; MIPS32: bb.9.b.PHI.2.0:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD9:%[0-9]+]]:gprb(s32) = G_LOAD [[COPY3]](p0) :: (load (s32) from %ir.a, align 8)
  ; MIPS32:   [[C10:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD4:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[COPY3]], [[C10]](s32)
  ; MIPS32:   [[LOAD10:%[0-9]+]]:gprb(s32) = G_LOAD [[PTR_ADD4]](p0) :: (load (s32) from %ir.a + 4, basealign 8)
  ; MIPS32:   G_BR %bb.11
  ; MIPS32: bb.10.b.PHI.2.1:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD11:%[0-9]+]]:gprb(s32) = G_LOAD [[LOAD]](p0) :: (load (s32) from %ir.b, align 8)
  ; MIPS32:   [[C11:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD5:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[LOAD]], [[C11]](s32)
  ; MIPS32:   [[LOAD12:%[0-9]+]]:gprb(s32) = G_LOAD [[PTR_ADD5]](p0) :: (load (s32) from %ir.b + 4, basealign 8)
  ; MIPS32: bb.11.b.PHI.2:
  ; MIPS32:   successors: %bb.13(0x40000000), %bb.12(0x40000000)
  ; MIPS32:   [[PHI2:%[0-9]+]]:gprb(s32) = G_PHI [[LOAD9]](s32), %bb.9, [[LOAD11]](s32), %bb.10
  ; MIPS32:   [[PHI3:%[0-9]+]]:gprb(s32) = G_PHI [[LOAD10]](s32), %bb.9, [[LOAD12]](s32), %bb.10
  ; MIPS32:   [[C12:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY9:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND5:%[0-9]+]]:gprb(s32) = G_AND [[COPY9]], [[C12]]
  ; MIPS32:   G_BRCOND [[AND5]](s32), %bb.13
  ; MIPS32: bb.12.b.PHI.2.end:
  ; MIPS32:   G_STORE [[PHI2]](s32), [[LOAD2]](p0) :: (store (s32) into %ir.result, align 8)
  ; MIPS32:   [[C13:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD6:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[LOAD2]], [[C13]](s32)
  ; MIPS32:   G_STORE [[PHI3]](s32), [[PTR_ADD6]](p0) :: (store (s32) into %ir.result + 4, basealign 8)
  ; MIPS32:   RetRA
  ; MIPS32: bb.13.b.PHI.3:
  ; MIPS32:   [[PHI4:%[0-9]+]]:gprb(s32) = G_PHI [[PHI2]](s32), %bb.11, [[PHI]](s32), %bb.6
  ; MIPS32:   [[PHI5:%[0-9]+]]:gprb(s32) = G_PHI [[PHI3]](s32), %bb.11, [[PHI1]](s32), %bb.6
  ; MIPS32:   [[PHI6:%[0-9]+]]:gprb(s32) = G_PHI [[PHI2]](s32), %bb.11, [[C]](s32), %bb.6
  ; MIPS32:   [[PHI7:%[0-9]+]]:gprb(s32) = G_PHI [[PHI3]](s32), %bb.11, [[C]](s32), %bb.6
  ; MIPS32:   [[C14:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY10:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND6:%[0-9]+]]:gprb(s32) = G_AND [[COPY10]], [[C14]]
  ; MIPS32:   [[SELECT:%[0-9]+]]:gprb(s32) = G_SELECT [[AND6]](s32), [[PHI4]], [[PHI6]]
  ; MIPS32:   [[SELECT1:%[0-9]+]]:gprb(s32) = G_SELECT [[AND6]](s32), [[PHI5]], [[PHI7]]
  ; MIPS32:   [[COPY11:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND7:%[0-9]+]]:gprb(s32) = G_AND [[COPY11]], [[C14]]
  ; MIPS32:   [[SELECT2:%[0-9]+]]:gprb(s32) = G_SELECT [[AND7]](s32), [[SELECT]], [[PHI4]]
  ; MIPS32:   [[SELECT3:%[0-9]+]]:gprb(s32) = G_SELECT [[AND7]](s32), [[SELECT1]], [[PHI5]]
  ; MIPS32:   G_STORE [[SELECT2]](s32), [[LOAD2]](p0) :: (store (s32) into %ir.result, align 8)
  ; MIPS32:   [[C15:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD7:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[LOAD2]], [[C15]](s32)
  ; MIPS32:   G_STORE [[SELECT3]](s32), [[PTR_ADD7]](p0) :: (store (s32) into %ir.result + 4, basealign 8)
  ; MIPS32:   G_STORE [[PHI4]](s32), [[LOAD2]](p0) :: (store (s32) into %ir.result, align 8)
  ; MIPS32:   [[C16:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 4
  ; MIPS32:   [[PTR_ADD8:%[0-9]+]]:gprb(p0) = G_PTR_ADD [[LOAD2]], [[C16]](s32)
  ; MIPS32:   G_STORE [[PHI5]](s32), [[PTR_ADD8]](p0) :: (store (s32) into %ir.result + 4, basealign 8)
  ; MIPS32:   RetRA
  bb.1.entry:
    liveins: $a0, $a1, $a2, $a3

    %7:_(s32) = COPY $a0
    %8:_(s32) = COPY $a1
    %9:_(s32) = COPY $a2
    %3:_(p0) = COPY $a3
    %10:_(p0) = G_FRAME_INDEX %fixed-stack.2
    %4:_(p0) = G_LOAD %10(p0) :: (load (p0) from %fixed-stack.2, align 8)
    %11:_(p0) = G_FRAME_INDEX %fixed-stack.1
    %5:_(p0) = G_LOAD %11(p0) :: (load (p0) from %fixed-stack.1)
    %12:_(p0) = G_FRAME_INDEX %fixed-stack.0
    %6:_(p0) = G_LOAD %12(p0) :: (load (p0) from %fixed-stack.0, align 8)
    %33:_(s32) = G_CONSTANT i32 0
    %24:_(s64) = G_MERGE_VALUES %33(s32), %33(s32)
    %34:_(s32) = G_CONSTANT i32 1
    %35:_(s32) = COPY %7(s32)
    %32:_(s32) = G_AND %35, %34
    G_BRCOND %32(s32), %bb.9

  bb.2.pre.PHI.1:
    %36:_(s32) = G_CONSTANT i32 1
    %37:_(s32) = COPY %8(s32)
    %31:_(s32) = G_AND %37, %36
    G_BRCOND %31(s32), %bb.5

  bb.3.pre.PHI.1.0:
    %38:_(s32) = G_CONSTANT i32 1
    %39:_(s32) = COPY %9(s32)
    %30:_(s32) = G_AND %39, %38
    G_BRCOND %30(s32), %bb.6

  bb.4.b.PHI.1.0:
    %13:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.7

  bb.5.b.PHI.1.1:
    %15:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)
    G_BR %bb.7

  bb.6.b.PHI.1.2:
    %14:_(s64) = G_LOAD %5(p0) :: (load (s64) from %ir.c)

  bb.7.b.PHI.1:
    %16:_(s64) = G_PHI %13(s64), %bb.4, %15(s64), %bb.5, %14(s64), %bb.6
    %40:_(s32) = G_CONSTANT i32 1
    %41:_(s32) = COPY %9(s32)
    %29:_(s32) = G_AND %41, %40
    G_BRCOND %29(s32), %bb.8
    G_BR %bb.14

  bb.8.b.PHI.1.end:
    G_STORE %16(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.9.pre.PHI.2:
    %42:_(s32) = G_CONSTANT i32 1
    %43:_(s32) = COPY %7(s32)
    %28:_(s32) = G_AND %43, %42
    G_BRCOND %28(s32), %bb.10
    G_BR %bb.11

  bb.10.b.PHI.2.0:
    %18:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.12

  bb.11.b.PHI.2.1:
    %17:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)

  bb.12.b.PHI.2:
    %19:_(s64) = G_PHI %18(s64), %bb.10, %17(s64), %bb.11
    %44:_(s32) = G_CONSTANT i32 1
    %45:_(s32) = COPY %8(s32)
    %27:_(s32) = G_AND %45, %44
    G_BRCOND %27(s32), %bb.14

  bb.13.b.PHI.2.end:
    G_STORE %19(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.14.b.PHI.3:
    %20:_(s64) = G_PHI %19(s64), %bb.12, %16(s64), %bb.7
    %21:_(s64) = G_PHI %19(s64), %bb.12, %24(s64), %bb.7
    %46:_(s32) = G_CONSTANT i32 1
    %47:_(s32) = COPY %9(s32)
    %26:_(s32) = G_AND %47, %46
    %22:_(s64) = G_SELECT %26(s32), %20, %21
    %48:_(s32) = COPY %8(s32)
    %25:_(s32) = G_AND %48, %46
    %23:_(s64) = G_SELECT %25(s32), %22, %20
    G_STORE %23(s64), %6(p0) :: (store (s64) into %ir.result)
    G_STORE %20(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

...
---
name:            long_chain_ambiguous_double_in_fpr
alignment:       4
legalized:       true
tracksRegLiveness: true
fixedStack:
  - { id: 0, offset: 24, size: 4, alignment: 8, isImmutable: true }
  - { id: 1, offset: 20, size: 4, alignment: 4, isImmutable: true }
  - { id: 2, offset: 16, size: 4, alignment: 8, isImmutable: true }
body:             |
  ; MIPS32-LABEL: name: long_chain_ambiguous_double_in_fpr
  ; MIPS32: bb.0.entry:
  ; MIPS32:   successors: %bb.8(0x40000000), %bb.1(0x40000000)
  ; MIPS32:   liveins: $a0, $a1, $a2, $a3
  ; MIPS32:   [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
  ; MIPS32:   [[COPY1:%[0-9]+]]:gprb(s32) = COPY $a1
  ; MIPS32:   [[COPY2:%[0-9]+]]:gprb(s32) = COPY $a2
  ; MIPS32:   [[COPY3:%[0-9]+]]:gprb(p0) = COPY $a3
  ; MIPS32:   [[FRAME_INDEX:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.0
  ; MIPS32:   [[LOAD:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (load (p0) from %fixed-stack.0, align 8)
  ; MIPS32:   [[FRAME_INDEX1:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.1
  ; MIPS32:   [[LOAD1:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (p0) from %fixed-stack.1)
  ; MIPS32:   [[FRAME_INDEX2:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.2
  ; MIPS32:   [[LOAD2:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX2]](p0) :: (load (p0) from %fixed-stack.2, align 8)
  ; MIPS32:   [[C:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY4:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND:%[0-9]+]]:gprb(s32) = G_AND [[COPY4]], [[C]]
  ; MIPS32:   G_BRCOND [[AND]](s32), %bb.8
  ; MIPS32: bb.1.pre.PHI.1:
  ; MIPS32:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
  ; MIPS32:   [[C1:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY5:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND1:%[0-9]+]]:gprb(s32) = G_AND [[COPY5]], [[C1]]
  ; MIPS32:   G_BRCOND [[AND1]](s32), %bb.4
  ; MIPS32: bb.2.pre.PHI.1.0:
  ; MIPS32:   successors: %bb.5(0x40000000), %bb.3(0x40000000)
  ; MIPS32:   [[C2:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY6:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND2:%[0-9]+]]:gprb(s32) = G_AND [[COPY6]], [[C2]]
  ; MIPS32:   G_BRCOND [[AND2]](s32), %bb.5
  ; MIPS32: bb.3.b.PHI.1.0:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD3:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY3]](p0) :: (load (s64) from %ir.a)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.4.b.PHI.1.1:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD4:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD]](p0) :: (load (s64) from %ir.b)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.5.b.PHI.1.2:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD5:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD1]](p0) :: (load (s64) from %ir.c)
  ; MIPS32: bb.6.b.PHI.1:
  ; MIPS32:   successors: %bb.7(0x40000000), %bb.13(0x40000000)
  ; MIPS32:   [[PHI:%[0-9]+]]:fprb(s64) = G_PHI [[LOAD3]](s64), %bb.3, [[LOAD4]](s64), %bb.4, [[LOAD5]](s64), %bb.5
  ; MIPS32:   [[C3:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY7:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND3:%[0-9]+]]:gprb(s32) = G_AND [[COPY7]], [[C3]]
  ; MIPS32:   G_BRCOND [[AND3]](s32), %bb.7
  ; MIPS32:   G_BR %bb.13
  ; MIPS32: bb.7.b.PHI.1.end:
  ; MIPS32:   G_STORE [[PHI]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  ; MIPS32: bb.8.pre.PHI.2:
  ; MIPS32:   successors: %bb.9(0x40000000), %bb.10(0x40000000)
  ; MIPS32:   [[C4:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY8:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND4:%[0-9]+]]:gprb(s32) = G_AND [[COPY8]], [[C4]]
  ; MIPS32:   G_BRCOND [[AND4]](s32), %bb.9
  ; MIPS32:   G_BR %bb.10
  ; MIPS32: bb.9.b.PHI.2.0:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD6:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY3]](p0) :: (load (s64) from %ir.a)
  ; MIPS32:   G_BR %bb.11
  ; MIPS32: bb.10.b.PHI.2.1:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD7:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD]](p0) :: (load (s64) from %ir.b)
  ; MIPS32: bb.11.b.PHI.2:
  ; MIPS32:   successors: %bb.13(0x40000000), %bb.12(0x40000000)
  ; MIPS32:   [[PHI1:%[0-9]+]]:fprb(s64) = G_PHI [[LOAD6]](s64), %bb.9, [[LOAD7]](s64), %bb.10
  ; MIPS32:   [[C5:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY9:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND5:%[0-9]+]]:gprb(s32) = G_AND [[COPY9]], [[C5]]
  ; MIPS32:   G_BRCOND [[AND5]](s32), %bb.13
  ; MIPS32: bb.12.b.PHI.2.end:
  ; MIPS32:   G_STORE [[PHI1]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  ; MIPS32: bb.13.b.PHI.3:
  ; MIPS32:   [[PHI2:%[0-9]+]]:fprb(s64) = G_PHI [[PHI1]](s64), %bb.11, [[PHI]](s64), %bb.6
  ; MIPS32:   [[PHI3:%[0-9]+]]:fprb(s64) = G_PHI [[PHI1]](s64), %bb.11, [[PHI]](s64), %bb.6
  ; MIPS32:   [[C6:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY10:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND6:%[0-9]+]]:gprb(s32) = G_AND [[COPY10]], [[C6]]
  ; MIPS32:   [[SELECT:%[0-9]+]]:fprb(s64) = G_SELECT [[AND6]](s32), [[PHI2]], [[PHI3]]
  ; MIPS32:   [[COPY11:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND7:%[0-9]+]]:gprb(s32) = G_AND [[COPY11]], [[C6]]
  ; MIPS32:   [[SELECT1:%[0-9]+]]:fprb(s64) = G_SELECT [[AND7]](s32), [[SELECT]], [[PHI2]]
  ; MIPS32:   G_STORE [[SELECT1]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   G_STORE [[PHI2]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  bb.1.entry:
    liveins: $a0, $a1, $a2, $a3

    %7:_(s32) = COPY $a0
    %8:_(s32) = COPY $a1
    %9:_(s32) = COPY $a2
    %3:_(p0) = COPY $a3
    %10:_(p0) = G_FRAME_INDEX %fixed-stack.2
    %4:_(p0) = G_LOAD %10(p0) :: (load (p0) from %fixed-stack.2, align 8)
    %11:_(p0) = G_FRAME_INDEX %fixed-stack.1
    %5:_(p0) = G_LOAD %11(p0) :: (load (p0) from %fixed-stack.1)
    %12:_(p0) = G_FRAME_INDEX %fixed-stack.0
    %6:_(p0) = G_LOAD %12(p0) :: (load (p0) from %fixed-stack.0, align 8)
    %32:_(s32) = G_CONSTANT i32 1
    %33:_(s32) = COPY %7(s32)
    %31:_(s32) = G_AND %33, %32
    G_BRCOND %31(s32), %bb.9

  bb.2.pre.PHI.1:
    %34:_(s32) = G_CONSTANT i32 1
    %35:_(s32) = COPY %8(s32)
    %30:_(s32) = G_AND %35, %34
    G_BRCOND %30(s32), %bb.5

  bb.3.pre.PHI.1.0:
    %36:_(s32) = G_CONSTANT i32 1
    %37:_(s32) = COPY %9(s32)
    %29:_(s32) = G_AND %37, %36
    G_BRCOND %29(s32), %bb.6

  bb.4.b.PHI.1.0:
    %13:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.7

  bb.5.b.PHI.1.1:
    %15:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)
    G_BR %bb.7

  bb.6.b.PHI.1.2:
    %14:_(s64) = G_LOAD %5(p0) :: (load (s64) from %ir.c)

  bb.7.b.PHI.1:
    %16:_(s64) = G_PHI %13(s64), %bb.4, %15(s64), %bb.5, %14(s64), %bb.6
    %38:_(s32) = G_CONSTANT i32 1
    %39:_(s32) = COPY %9(s32)
    %28:_(s32) = G_AND %39, %38
    G_BRCOND %28(s32), %bb.8
    G_BR %bb.14

  bb.8.b.PHI.1.end:
    G_STORE %16(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.9.pre.PHI.2:
    %40:_(s32) = G_CONSTANT i32 1
    %41:_(s32) = COPY %7(s32)
    %27:_(s32) = G_AND %41, %40
    G_BRCOND %27(s32), %bb.10
    G_BR %bb.11

  bb.10.b.PHI.2.0:
    %18:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.12

  bb.11.b.PHI.2.1:
    %17:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)

  bb.12.b.PHI.2:
    %19:_(s64) = G_PHI %18(s64), %bb.10, %17(s64), %bb.11
    %42:_(s32) = G_CONSTANT i32 1
    %43:_(s32) = COPY %8(s32)
    %26:_(s32) = G_AND %43, %42
    G_BRCOND %26(s32), %bb.14

  bb.13.b.PHI.2.end:
    G_STORE %19(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.14.b.PHI.3:
    %20:_(s64) = G_PHI %19(s64), %bb.12, %16(s64), %bb.7
    %21:_(s64) = G_PHI %19(s64), %bb.12, %16(s64), %bb.7
    %44:_(s32) = G_CONSTANT i32 1
    %45:_(s32) = COPY %9(s32)
    %25:_(s32) = G_AND %45, %44
    %22:_(s64) = G_SELECT %25(s32), %20, %21
    %46:_(s32) = COPY %8(s32)
    %24:_(s32) = G_AND %46, %44
    %23:_(s64) = G_SELECT %24(s32), %22, %20
    G_STORE %23(s64), %6(p0) :: (store (s64) into %ir.result)
    G_STORE %20(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

...
---
name:            long_chain_double_in_fpr
alignment:       4
legalized:       true
tracksRegLiveness: true
fixedStack:
  - { id: 0, offset: 24, size: 4, alignment: 8, isImmutable: true }
  - { id: 1, offset: 20, size: 4, alignment: 4, isImmutable: true }
  - { id: 2, offset: 16, size: 4, alignment: 8, isImmutable: true }
body:             |
  ; MIPS32-LABEL: name: long_chain_double_in_fpr
  ; MIPS32: bb.0.entry:
  ; MIPS32:   successors: %bb.8(0x40000000), %bb.1(0x40000000)
  ; MIPS32:   liveins: $a0, $a1, $a2, $a3
  ; MIPS32:   [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
  ; MIPS32:   [[COPY1:%[0-9]+]]:gprb(s32) = COPY $a1
  ; MIPS32:   [[COPY2:%[0-9]+]]:gprb(s32) = COPY $a2
  ; MIPS32:   [[COPY3:%[0-9]+]]:gprb(p0) = COPY $a3
  ; MIPS32:   [[FRAME_INDEX:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.0
  ; MIPS32:   [[LOAD:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (load (p0) from %fixed-stack.0, align 8)
  ; MIPS32:   [[FRAME_INDEX1:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.1
  ; MIPS32:   [[LOAD1:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (p0) from %fixed-stack.1)
  ; MIPS32:   [[FRAME_INDEX2:%[0-9]+]]:gprb(p0) = G_FRAME_INDEX %fixed-stack.2
  ; MIPS32:   [[LOAD2:%[0-9]+]]:gprb(p0) = G_LOAD [[FRAME_INDEX2]](p0) :: (load (p0) from %fixed-stack.2, align 8)
  ; MIPS32:   [[C:%[0-9]+]]:fprb(s64) = G_FCONSTANT double 0.000000e+00
  ; MIPS32:   [[C1:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY4:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND:%[0-9]+]]:gprb(s32) = G_AND [[COPY4]], [[C1]]
  ; MIPS32:   G_BRCOND [[AND]](s32), %bb.8
  ; MIPS32: bb.1.pre.PHI.1:
  ; MIPS32:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
  ; MIPS32:   [[C2:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY5:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND1:%[0-9]+]]:gprb(s32) = G_AND [[COPY5]], [[C2]]
  ; MIPS32:   G_BRCOND [[AND1]](s32), %bb.4
  ; MIPS32: bb.2.pre.PHI.1.0:
  ; MIPS32:   successors: %bb.5(0x40000000), %bb.3(0x40000000)
  ; MIPS32:   [[C3:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY6:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND2:%[0-9]+]]:gprb(s32) = G_AND [[COPY6]], [[C3]]
  ; MIPS32:   G_BRCOND [[AND2]](s32), %bb.5
  ; MIPS32: bb.3.b.PHI.1.0:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD3:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY3]](p0) :: (load (s64) from %ir.a)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.4.b.PHI.1.1:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD4:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD]](p0) :: (load (s64) from %ir.b)
  ; MIPS32:   G_BR %bb.6
  ; MIPS32: bb.5.b.PHI.1.2:
  ; MIPS32:   successors: %bb.6(0x80000000)
  ; MIPS32:   [[LOAD5:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD1]](p0) :: (load (s64) from %ir.c)
  ; MIPS32: bb.6.b.PHI.1:
  ; MIPS32:   successors: %bb.7(0x40000000), %bb.13(0x40000000)
  ; MIPS32:   [[PHI:%[0-9]+]]:fprb(s64) = G_PHI [[LOAD3]](s64), %bb.3, [[LOAD4]](s64), %bb.4, [[LOAD5]](s64), %bb.5
  ; MIPS32:   [[C4:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY7:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND3:%[0-9]+]]:gprb(s32) = G_AND [[COPY7]], [[C4]]
  ; MIPS32:   G_BRCOND [[AND3]](s32), %bb.7
  ; MIPS32:   G_BR %bb.13
  ; MIPS32: bb.7.b.PHI.1.end:
  ; MIPS32:   G_STORE [[PHI]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  ; MIPS32: bb.8.pre.PHI.2:
  ; MIPS32:   successors: %bb.9(0x40000000), %bb.10(0x40000000)
  ; MIPS32:   [[C5:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY8:%[0-9]+]]:gprb(s32) = COPY [[COPY]](s32)
  ; MIPS32:   [[AND4:%[0-9]+]]:gprb(s32) = G_AND [[COPY8]], [[C5]]
  ; MIPS32:   G_BRCOND [[AND4]](s32), %bb.9
  ; MIPS32:   G_BR %bb.10
  ; MIPS32: bb.9.b.PHI.2.0:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD6:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY3]](p0) :: (load (s64) from %ir.a)
  ; MIPS32:   G_BR %bb.11
  ; MIPS32: bb.10.b.PHI.2.1:
  ; MIPS32:   successors: %bb.11(0x80000000)
  ; MIPS32:   [[LOAD7:%[0-9]+]]:fprb(s64) = G_LOAD [[LOAD]](p0) :: (load (s64) from %ir.b)
  ; MIPS32: bb.11.b.PHI.2:
  ; MIPS32:   successors: %bb.13(0x40000000), %bb.12(0x40000000)
  ; MIPS32:   [[PHI1:%[0-9]+]]:fprb(s64) = G_PHI [[LOAD6]](s64), %bb.9, [[LOAD7]](s64), %bb.10
  ; MIPS32:   [[C6:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY9:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND5:%[0-9]+]]:gprb(s32) = G_AND [[COPY9]], [[C6]]
  ; MIPS32:   G_BRCOND [[AND5]](s32), %bb.13
  ; MIPS32: bb.12.b.PHI.2.end:
  ; MIPS32:   G_STORE [[PHI1]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  ; MIPS32: bb.13.b.PHI.3:
  ; MIPS32:   [[PHI2:%[0-9]+]]:fprb(s64) = G_PHI [[PHI1]](s64), %bb.11, [[PHI]](s64), %bb.6
  ; MIPS32:   [[PHI3:%[0-9]+]]:fprb(s64) = G_PHI [[PHI1]](s64), %bb.11, [[C]](s64), %bb.6
  ; MIPS32:   [[C7:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 1
  ; MIPS32:   [[COPY10:%[0-9]+]]:gprb(s32) = COPY [[COPY2]](s32)
  ; MIPS32:   [[AND6:%[0-9]+]]:gprb(s32) = G_AND [[COPY10]], [[C7]]
  ; MIPS32:   [[SELECT:%[0-9]+]]:fprb(s64) = G_SELECT [[AND6]](s32), [[PHI2]], [[PHI3]]
  ; MIPS32:   [[COPY11:%[0-9]+]]:gprb(s32) = COPY [[COPY1]](s32)
  ; MIPS32:   [[AND7:%[0-9]+]]:gprb(s32) = G_AND [[COPY11]], [[C7]]
  ; MIPS32:   [[SELECT1:%[0-9]+]]:fprb(s64) = G_SELECT [[AND7]](s32), [[SELECT]], [[PHI2]]
  ; MIPS32:   G_STORE [[SELECT1]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   G_STORE [[PHI2]](s64), [[LOAD2]](p0) :: (store (s64) into %ir.result)
  ; MIPS32:   RetRA
  bb.1.entry:
    liveins: $a0, $a1, $a2, $a3

    %7:_(s32) = COPY $a0
    %8:_(s32) = COPY $a1
    %9:_(s32) = COPY $a2
    %3:_(p0) = COPY $a3
    %10:_(p0) = G_FRAME_INDEX %fixed-stack.2
    %4:_(p0) = G_LOAD %10(p0) :: (load (p0) from %fixed-stack.2, align 8)
    %11:_(p0) = G_FRAME_INDEX %fixed-stack.1
    %5:_(p0) = G_LOAD %11(p0) :: (load (p0) from %fixed-stack.1)
    %12:_(p0) = G_FRAME_INDEX %fixed-stack.0
    %6:_(p0) = G_LOAD %12(p0) :: (load (p0) from %fixed-stack.0, align 8)
    %24:_(s64) = G_FCONSTANT double 0.000000e+00
    %33:_(s32) = G_CONSTANT i32 1
    %34:_(s32) = COPY %7(s32)
    %32:_(s32) = G_AND %34, %33
    G_BRCOND %32(s32), %bb.9

  bb.2.pre.PHI.1:
    %35:_(s32) = G_CONSTANT i32 1
    %36:_(s32) = COPY %8(s32)
    %31:_(s32) = G_AND %36, %35
    G_BRCOND %31(s32), %bb.5

  bb.3.pre.PHI.1.0:
    %37:_(s32) = G_CONSTANT i32 1
    %38:_(s32) = COPY %9(s32)
    %30:_(s32) = G_AND %38, %37
    G_BRCOND %30(s32), %bb.6

  bb.4.b.PHI.1.0:
    %13:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.7

  bb.5.b.PHI.1.1:
    %15:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)
    G_BR %bb.7

  bb.6.b.PHI.1.2:
    %14:_(s64) = G_LOAD %5(p0) :: (load (s64) from %ir.c)

  bb.7.b.PHI.1:
    %16:_(s64) = G_PHI %13(s64), %bb.4, %15(s64), %bb.5, %14(s64), %bb.6
    %39:_(s32) = G_CONSTANT i32 1
    %40:_(s32) = COPY %9(s32)
    %29:_(s32) = G_AND %40, %39
    G_BRCOND %29(s32), %bb.8
    G_BR %bb.14

  bb.8.b.PHI.1.end:
    G_STORE %16(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.9.pre.PHI.2:
    %41:_(s32) = G_CONSTANT i32 1
    %42:_(s32) = COPY %7(s32)
    %28:_(s32) = G_AND %42, %41
    G_BRCOND %28(s32), %bb.10
    G_BR %bb.11

  bb.10.b.PHI.2.0:
    %18:_(s64) = G_LOAD %3(p0) :: (load (s64) from %ir.a)
    G_BR %bb.12

  bb.11.b.PHI.2.1:
    %17:_(s64) = G_LOAD %4(p0) :: (load (s64) from %ir.b)

  bb.12.b.PHI.2:
    %19:_(s64) = G_PHI %18(s64), %bb.10, %17(s64), %bb.11
    %43:_(s32) = G_CONSTANT i32 1
    %44:_(s32) = COPY %8(s32)
    %27:_(s32) = G_AND %44, %43
    G_BRCOND %27(s32), %bb.14

  bb.13.b.PHI.2.end:
    G_STORE %19(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

  bb.14.b.PHI.3:
    %20:_(s64) = G_PHI %19(s64), %bb.12, %16(s64), %bb.7
    %21:_(s64) = G_PHI %19(s64), %bb.12, %24(s64), %bb.7
    %45:_(s32) = G_CONSTANT i32 1
    %46:_(s32) = COPY %9(s32)
    %26:_(s32) = G_AND %46, %45
    %22:_(s64) = G_SELECT %26(s32), %20, %21
    %47:_(s32) = COPY %8(s32)
    %25:_(s32) = G_AND %47, %45
    %23:_(s64) = G_SELECT %25(s32), %22, %20
    G_STORE %23(s64), %6(p0) :: (store (s64) into %ir.result)
    G_STORE %20(s64), %6(p0) :: (store (s64) into %ir.result)
    RetRA

...