Home | History | Annotate | Download | only in longbranch
      1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
      2 # RUN: llc -mtriple=mips-mti-linux-gnu -mattr=+micromips %s -o - -start-before mips-delay-slot-filler -stop-after mips-branch-expansion | FileCheck %s --check-prefix=MM
      3 # RUN: llc -mtriple=mips-mti-linux-gnu -mattr=+micromips %s -o - -start-before mips-delay-slot-filler -stop-after mips-branch-expansion -relocation-model=pic | FileCheck %s --check-prefix=PIC
      4 
      5 # Test the long branch expansion of various branches
      6 
      7 --- |
      8 
      9   define i32 @a(double %a, double %b) {
     10   entry:
     11     %cmp = fcmp une double %a, %b
     12     br i1 %cmp, label %if.then, label %return
     13 
     14   if.then:
     15     call void asm sideeffect ".space 310680", "~{$1}"()
     16     ret i32 0
     17 
     18   return:
     19     ret i32 1
     20   }
     21 
     22   define i32 @b(double %a, double %b) {
     23   entry:
     24     %cmp = fcmp ueq double %a, %b
     25     br i1 %cmp, label %if.then, label %return
     26 
     27   if.then:
     28     call void asm sideeffect ".space 310680", "~{$1}"()
     29     ret i32 0
     30 
     31   return:
     32     ret i32 1
     33   }
     34 
     35 ...
     36 ---
     37 name:            a
     38 alignment:       2
     39 exposesReturnsTwice: false
     40 legalized:       false
     41 regBankSelected: false
     42 selected:        false
     43 failedISel:      false
     44 tracksRegLiveness: true
     45 registers:
     46 liveins:
     47   - { reg: '$d6', virtual-reg: '' }
     48   - { reg: '$d7', virtual-reg: '' }
     49 frameInfo:
     50   isFrameAddressTaken: false
     51   isReturnAddressTaken: false
     52   hasStackMap:     false
     53   hasPatchPoint:   false
     54   stackSize:       0
     55   offsetAdjustment: 0
     56   maxAlignment:    1
     57   adjustsStack:    false
     58   hasCalls:        false
     59   stackProtector:  ''
     60   maxCallFrameSize: 0
     61   hasOpaqueSPAdjustment: false
     62   hasVAStart:      false
     63   hasMustTailInVarArgFunc: false
     64   localFrameSize:  0
     65   savePoint:       ''
     66   restorePoint:    ''
     67 fixedStack:
     68 stack:
     69 constants:
     70 body:             |
     71   ; MM-LABEL: name: a
     72   ; MM: bb.0.entry:
     73   ; MM:   successors: %bb.2(0x50000000), %bb.1(0x30000000)
     74   ; MM:   FCMP_D32_MM killed renamable $d6, killed renamable $d7, 2, implicit-def $fcc0
     75   ; MM:   BC1F_MM $fcc0, %bb.2, implicit-def $at {
     76   ; MM:     NOP
     77   ; MM:   }
     78   ; MM: bb.1.entry:
     79   ; MM:   successors: %bb.3(0x80000000)
     80   ; MM:   J %bb.3, implicit-def $at {
     81   ; MM:     NOP
     82   ; MM:   }
     83   ; MM: bb.2.if.then:
     84   ; MM:   INLINEASM &".space 310680", 1, 12, implicit-def dead early-clobber $at
     85   ; MM:   $v0 = LI16_MM 0
     86   ; MM:   JRC16_MM undef $ra, implicit killed $v0
     87   ; MM: bb.3.return:
     88   ; MM:   $v0 = LI16_MM 1
     89   ; MM:   JRC16_MM undef $ra, implicit killed $v0
     90   ; PIC-LABEL: name: a
     91   ; PIC: bb.0.entry:
     92   ; PIC:   successors: %bb.3(0x50000000), %bb.1(0x30000000)
     93   ; PIC:   FCMP_D32_MM killed renamable $d6, killed renamable $d7, 2, implicit-def $fcc0
     94   ; PIC:   BC1F_MM $fcc0, %bb.3, implicit-def $at {
     95   ; PIC:     NOP
     96   ; PIC:   }
     97   ; PIC: bb.1.entry:
     98   ; PIC:   successors: %bb.2(0x80000000)
     99   ; PIC:   $sp = ADDiu $sp, -8
    100   ; PIC:   SW $ra, $sp, 0
    101   ; PIC:   $at = LONG_BRANCH_LUi target-flags(mips-abs-hi) %bb.4, %bb.2
    102   ; PIC:   BAL_BR_MM %bb.2, implicit-def $ra {
    103   ; PIC:     $at = LONG_BRANCH_ADDiu $at, target-flags(mips-abs-lo) %bb.4, %bb.2
    104   ; PIC:   }
    105   ; PIC: bb.2.entry:
    106   ; PIC:   successors: %bb.4(0x80000000)
    107   ; PIC:   $at = ADDu $ra, $at
    108   ; PIC:   $ra = LW $sp, 0
    109   ; PIC:   JR $at {
    110   ; PIC:     $sp = ADDiu $sp, 8
    111   ; PIC:   }
    112   ; PIC: bb.3.if.then:
    113   ; PIC:   INLINEASM &".space 310680", 1, 12, implicit-def dead early-clobber $at
    114   ; PIC:   $v0 = LI16_MM 0
    115   ; PIC:   JRC16_MM undef $ra, implicit killed $v0
    116   ; PIC: bb.4.return:
    117   ; PIC:   $v0 = LI16_MM 1
    118   ; PIC:   JRC16_MM undef $ra, implicit killed $v0
    119   bb.0.entry:
    120     successors: %bb.1(0x50000000), %bb.2(0x30000000)
    121     liveins: $d6, $d7
    122 
    123     FCMP_D32_MM killed renamable $d6, killed renamable $d7, 2, implicit-def $fcc0
    124     BC1T_MM killed $fcc0, %bb.2, implicit-def dead $at
    125 
    126   bb.1.if.then:
    127     INLINEASM &".space 310680", 1, 12, implicit-def dead early-clobber $at
    128     $v0 = LI16_MM 0
    129     PseudoReturn undef $ra, implicit killed $v0
    130 
    131   bb.2.return:
    132     $v0 = LI16_MM 1
    133     PseudoReturn undef $ra, implicit killed $v0
    134 
    135 ...
    136 ---
    137 name:            b
    138 alignment:       2
    139 exposesReturnsTwice: false
    140 legalized:       false
    141 regBankSelected: false
    142 selected:        false
    143 failedISel:      false
    144 tracksRegLiveness: true
    145 registers:
    146 liveins:
    147   - { reg: '$d6', virtual-reg: '' }
    148   - { reg: '$d7', virtual-reg: '' }
    149 frameInfo:
    150   isFrameAddressTaken: false
    151   isReturnAddressTaken: false
    152   hasStackMap:     false
    153   hasPatchPoint:   false
    154   stackSize:       0
    155   offsetAdjustment: 0
    156   maxAlignment:    1
    157   adjustsStack:    false
    158   hasCalls:        false
    159   stackProtector:  ''
    160   maxCallFrameSize: 0
    161   hasOpaqueSPAdjustment: false
    162   hasVAStart:      false
    163   hasMustTailInVarArgFunc: false
    164   localFrameSize:  0
    165   savePoint:       ''
    166   restorePoint:    ''
    167 fixedStack:
    168 stack:
    169 constants:
    170 body:             |
    171   ; MM-LABEL: name: b
    172   ; MM: bb.0.entry:
    173   ; MM:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
    174   ; MM:   FCMP_D32_MM killed renamable $d6, killed renamable $d7, 19, implicit-def $fcc0
    175   ; MM:   BC1F_MM killed $fcc0, %bb.1, implicit-def dead $at {
    176   ; MM:     NOP
    177   ; MM:   }
    178   ; MM: bb.1.return:
    179   ; MM:   $v0 = LI16_MM 1
    180   ; MM:   JRC16_MM undef $ra, implicit killed $v0
    181   ; MM: bb.2.if.then:
    182   ; MM:   INLINEASM &".space 310680", 1, 12, implicit-def dead early-clobber $at
    183   ; MM:   $v0 = LI16_MM 0
    184   ; MM:   JRC16_MM undef $ra, implicit killed $v0
    185   ; PIC-LABEL: name: b
    186   ; PIC: bb.0.entry:
    187   ; PIC:   successors: %bb.2(0x30000000), %bb.1(0x50000000)
    188   ; PIC:   FCMP_D32_MM killed renamable $d6, killed renamable $d7, 19, implicit-def $fcc0
    189   ; PIC:   BC1F_MM killed $fcc0, %bb.1, implicit-def dead $at {
    190   ; PIC:     NOP
    191   ; PIC:   }
    192   ; PIC: bb.1.return:
    193   ; PIC:   $v0 = LI16_MM 1
    194   ; PIC:   JRC16_MM undef $ra, implicit killed $v0
    195   ; PIC: bb.2.if.then:
    196   ; PIC:   INLINEASM &".space 310680", 1, 12, implicit-def dead early-clobber $at
    197   ; PIC:   $v0 = LI16_MM 0
    198   ; PIC:   JRC16_MM undef $ra, implicit killed $v0
    199   bb.0.entry:
    200     successors: %bb.1(0x30000000), %bb.2(0x50000000)
    201     liveins: $d6, $d7
    202 
    203     FCMP_D32_MM killed renamable $d6, killed renamable $d7, 19, implicit-def $fcc0
    204     BC1F_MM killed $fcc0, %bb.2, implicit-def dead $at
    205 
    206   bb.2.return:
    207     $v0 = LI16_MM 1
    208     PseudoReturn undef $ra, implicit killed $v0
    209 
    210   bb.1.if.then:
    211     INLINEASM &".space 310680", 1, 12, implicit-def dead early-clobber $at
    212     $v0 = LI16_MM 0
    213     PseudoReturn undef $ra, implicit killed $v0
    214 
    215 ...
    216