Home | History | Annotate | Download | only in indirect-jump-hazard
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ;       Except for the NACL version which isn't parsed by update_llc_test_checks.py
      3 
      4 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -force-mips-long-branch -O3 \
      5 ; RUN:   -mcpu=mips32r2 -mattr=+use-indirect-jump-hazard -relocation-model=pic \
      6 ; RUN:   -verify-machineinstrs < %s | FileCheck %s -check-prefix=O32-PIC
      7 
      8 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r6 \
      9 ; RUN:   -force-mips-long-branch -O3 -mattr=+use-indirect-jump-hazard  \
     10 ; RUN:   -relocation-model=pic -verify-machineinstrs < %s \
     11 ; RUN:   | FileCheck %s -check-prefix=O32-R6-PIC
     12 
     13 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -mcpu=mips64r2 -target-abi=n64 \
     14 ; RUN:   -force-mips-long-branch -O3 -relocation-model=pic \
     15 ; RUN:   -mattr=+use-indirect-jump-hazard -verify-machineinstrs \
     16 ; RUN:   < %s | FileCheck %s -check-prefix=MIPS64
     17 
     18 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -mcpu=mips64r6 -target-abi=n64 \
     19 ; RUN:   -force-mips-long-branch -O3 -mattr=+use-indirect-jump-hazard \
     20 ; RUN:   -relocation-model=pic -verify-machineinstrs < %s \
     21 ; RUN:   | FileCheck %s -check-prefix=N64-R6
     22 
     23 ; Test that the long branches also get changed to their hazard variants.
     24 
     25 @x = external global i32
     26 
     27 define void @test1(i32 signext %s) {
     28 ; O32-PIC-LABEL: test1:
     29 ; O32-PIC:       # %bb.0: # %entry
     30 ; O32-PIC-NEXT:    lui $2, %hi(_gp_disp)
     31 ; O32-PIC-NEXT:    addiu $2, $2, %lo(_gp_disp)
     32 ; O32-PIC-NEXT:    bnez $4, $BB0_3
     33 ; O32-PIC-NEXT:    addu $2, $2, $25
     34 ; O32-PIC-NEXT:  # %bb.1: # %entry
     35 ; O32-PIC-NEXT:    addiu $sp, $sp, -8
     36 ; O32-PIC-NEXT:    sw $ra, 0($sp)
     37 ; O32-PIC-NEXT:    lui $1, %hi(($BB0_4)-($BB0_2))
     38 ; O32-PIC-NEXT:    bal $BB0_2
     39 ; O32-PIC-NEXT:    addiu $1, $1, %lo(($BB0_4)-($BB0_2))
     40 ; O32-PIC-NEXT:  $BB0_2: # %entry
     41 ; O32-PIC-NEXT:    addu $1, $ra, $1
     42 ; O32-PIC-NEXT:    lw $ra, 0($sp)
     43 ; O32-PIC-NEXT:    jr.hb $1
     44 ; O32-PIC-NEXT:    addiu $sp, $sp, 8
     45 ; O32-PIC-NEXT:  $BB0_3: # %then
     46 ; O32-PIC-NEXT:    lw $1, %got(x)($2)
     47 ; O32-PIC-NEXT:    addiu $2, $zero, 1
     48 ; O32-PIC-NEXT:    sw $2, 0($1)
     49 ; O32-PIC-NEXT:  $BB0_4: # %end
     50 ; O32-PIC-NEXT:    jr $ra
     51 ; O32-PIC-NEXT:    nop
     52 ;
     53 ; O32-R6-PIC-LABEL: test1:
     54 ; O32-R6-PIC:       # %bb.0: # %entry
     55 ; O32-R6-PIC-NEXT:    lui $2, %hi(_gp_disp)
     56 ; O32-R6-PIC-NEXT:    addiu $2, $2, %lo(_gp_disp)
     57 ; O32-R6-PIC-NEXT:    bnez $4, $BB0_3
     58 ; O32-R6-PIC-NEXT:    addu $2, $2, $25
     59 ; O32-R6-PIC-NEXT:  # %bb.1: # %entry
     60 ; O32-R6-PIC-NEXT:    addiu $sp, $sp, -8
     61 ; O32-R6-PIC-NEXT:    sw $ra, 0($sp)
     62 ; O32-R6-PIC-NEXT:    lui $1, %hi(($BB0_4)-($BB0_2))
     63 ; O32-R6-PIC-NEXT:    addiu $1, $1, %lo(($BB0_4)-($BB0_2))
     64 ; O32-R6-PIC-NEXT:    balc $BB0_2
     65 ; O32-R6-PIC-NEXT:  $BB0_2: # %entry
     66 ; O32-R6-PIC-NEXT:    addu $1, $ra, $1
     67 ; O32-R6-PIC-NEXT:    lw $ra, 0($sp)
     68 ; O32-R6-PIC-NEXT:    jr.hb $1
     69 ; O32-R6-PIC-NEXT:    addiu $sp, $sp, 8
     70 ; O32-R6-PIC-NEXT:  $BB0_3: # %then
     71 ; O32-R6-PIC-NEXT:    lw $1, %got(x)($2)
     72 ; O32-R6-PIC-NEXT:    addiu $2, $zero, 1
     73 ; O32-R6-PIC-NEXT:    sw $2, 0($1)
     74 ; O32-R6-PIC-NEXT:  $BB0_4: # %end
     75 ; O32-R6-PIC-NEXT:    jrc $ra
     76 ;
     77 ; MIPS64-LABEL: test1:
     78 ; MIPS64:       # %bb.0: # %entry
     79 ; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(test1)))
     80 ; MIPS64-NEXT:    bnez $4, .LBB0_3
     81 ; MIPS64-NEXT:    daddu $2, $1, $25
     82 ; MIPS64-NEXT:  # %bb.1: # %entry
     83 ; MIPS64-NEXT:    daddiu $sp, $sp, -16
     84 ; MIPS64-NEXT:    sd $ra, 0($sp)
     85 ; MIPS64-NEXT:    daddiu $1, $zero, %hi(.LBB0_4-.LBB0_2)
     86 ; MIPS64-NEXT:    dsll $1, $1, 16
     87 ; MIPS64-NEXT:    bal .LBB0_2
     88 ; MIPS64-NEXT:    daddiu $1, $1, %lo(.LBB0_4-.LBB0_2)
     89 ; MIPS64-NEXT:  .LBB0_2: # %entry
     90 ; MIPS64-NEXT:    daddu $1, $ra, $1
     91 ; MIPS64-NEXT:    ld $ra, 0($sp)
     92 ; MIPS64-NEXT:    jr.hb $1
     93 ; MIPS64-NEXT:    daddiu $sp, $sp, 16
     94 ; MIPS64-NEXT:  .LBB0_3: # %then
     95 ; MIPS64-NEXT:    daddiu $1, $2, %lo(%neg(%gp_rel(test1)))
     96 ; MIPS64-NEXT:    addiu $2, $zero, 1
     97 ; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
     98 ; MIPS64-NEXT:    sw $2, 0($1)
     99 ; MIPS64-NEXT:  .LBB0_4: # %end
    100 ; MIPS64-NEXT:    jr $ra
    101 ; MIPS64-NEXT:    nop
    102 ;
    103 ; N64-R6-LABEL: test1:
    104 ; N64-R6:       # %bb.0: # %entry
    105 ; N64-R6-NEXT:    lui $1, %hi(%neg(%gp_rel(test1)))
    106 ; N64-R6-NEXT:    bnez $4, .LBB0_3
    107 ; N64-R6-NEXT:    daddu $2, $1, $25
    108 ; N64-R6-NEXT:  # %bb.1: # %entry
    109 ; N64-R6-NEXT:    daddiu $sp, $sp, -16
    110 ; N64-R6-NEXT:    sd $ra, 0($sp)
    111 ; N64-R6-NEXT:    daddiu $1, $zero, %hi(.LBB0_4-.LBB0_2)
    112 ; N64-R6-NEXT:    dsll $1, $1, 16
    113 ; N64-R6-NEXT:    daddiu $1, $1, %lo(.LBB0_4-.LBB0_2)
    114 ; N64-R6-NEXT:    balc .LBB0_2
    115 ; N64-R6-NEXT:  .LBB0_2: # %entry
    116 ; N64-R6-NEXT:    daddu $1, $ra, $1
    117 ; N64-R6-NEXT:    ld $ra, 0($sp)
    118 ; N64-R6-NEXT:    jr.hb $1
    119 ; N64-R6-NEXT:    daddiu $sp, $sp, 16
    120 ; N64-R6-NEXT:  .LBB0_3: # %then
    121 ; N64-R6-NEXT:    daddiu $1, $2, %lo(%neg(%gp_rel(test1)))
    122 ; N64-R6-NEXT:    addiu $2, $zero, 1
    123 ; N64-R6-NEXT:    ld $1, %got_disp(x)($1)
    124 ; N64-R6-NEXT:    sw $2, 0($1)
    125 ; N64-R6-NEXT:  .LBB0_4: # %end
    126 ; N64-R6-NEXT:    jrc $ra
    127 entry:
    128   %cmp = icmp eq i32 %s, 0
    129   br i1 %cmp, label %end, label %then
    130 
    131 then:
    132   store i32 1, i32* @x, align 4
    133   br label %end
    134 
    135 end:
    136   ret void
    137 
    138 }
    139