llvm.org GIT mirror llvm / release_60 test / CodeGen / ARM / v6-jumptable-clobber.mir
release_60

Tree @release_60 (Download .tar.gz)

v6-jumptable-clobber.mir @release_60raw · history · blame

# RUN: llc -run-pass=arm-cp-islands -o - %s | FileCheck %s

# Test created by tweaking the register allocation after stopping the IR below
# just before constant islands. We were forwarding the table index to the end of
# the block, even though the LEA clobbered it.

# CHECK-LABEL: name: foo
# CHECK:     tBR_JT
  # This order is important. If the jump-table comes first then the
  # transformation is valid because the LEA can be removed, see second test.
# CHECK:     CONSTPOOL_ENTRY
# CHECK:     JUMPTABLE_ADDRS

# CHECK-LABEL: name: bar
# CHECK: tTBB_JT %pc, killed %r1

--- |
  ; ModuleID = 'simple.ll'
  source_filename = "simple.ll"
  target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
  target triple = "thumbv6m-none--eabi"
  
  define void @foo(i8 %in, i32* %addr) {
    store i32 12345678, i32* %addr
    %1 = call i32 @llvm.arm.space(i32 980, i32 undef)
    %2 = zext i8 %in to i32
    switch i32 %2, label %default [
      i32 0, label %d1
      i32 1, label %d2
      i32 3, label %d3
      i32 4, label %d4
      i32 5, label %d5
      i32 6, label %d6
      i32 7, label %d7
      i32 2, label %d8
      i32 8, label %d9
      i32 9, label %d10
      i32 19, label %d11
      i32 20, label %d12
      i32 21, label %d13
      i32 22, label %d14
      i32 24, label %d15
      i32 25, label %d16
      i32 26, label %d17
    ]
  
  default:                                          ; preds = %0
    unreachable
  
  d1:                                               ; preds = %0
    unreachable
  
  d2:                                               ; preds = %0
    unreachable
  
  d3:                                               ; preds = %0
    unreachable
  
  d4:                                               ; preds = %0
    unreachable
  
  d5:                                               ; preds = %0
    unreachable
  
  d6:                                               ; preds = %0
    unreachable
  
  d7:                                               ; preds = %0
    unreachable
  
  d8:                                               ; preds = %0
    unreachable
  
  d9:                                               ; preds = %0
    unreachable
  
  d10:                                              ; preds = %0
    unreachable
  
  d11:                                              ; preds = %0
    unreachable
  
  d12:                                              ; preds = %0
    unreachable
  
  d13:                                              ; preds = %0
    unreachable
  
  d14:                                              ; preds = %0
    unreachable
  
  d15:                                              ; preds = %0
    unreachable
  
  d16:                                              ; preds = %0
    unreachable
  
  d17:                                              ; preds = %0
    unreachable
  }

  define void @bar(i8 %in, i32* %addr) {
      store i32 12345678, i32* %addr
    %1 = zext i8 %in to i32
    switch i32 %1, label %default [
      i32 0, label %d1
      i32 1, label %d2
      i32 3, label %d3
      i32 4, label %d4
      i32 5, label %d5
      i32 6, label %d6
      i32 7, label %d7
      i32 2, label %d8
      i32 8, label %d9
      i32 9, label %d10
      i32 19, label %d11
      i32 20, label %d12
      i32 21, label %d13
      i32 22, label %d14
      i32 24, label %d15
      i32 25, label %d16
      i32 26, label %d17
    ]
  
  default:                                          ; preds = %0
    unreachable
  
  d1:                                               ; preds = %0
    unreachable
  
  d2:                                               ; preds = %0
    unreachable
  
  d3:                                               ; preds = %0
    unreachable
  
  d4:                                               ; preds = %0
    unreachable
  
  d5:                                               ; preds = %0
    unreachable
  
  d6:                                               ; preds = %0
    unreachable
  
  d7:                                               ; preds = %0
    unreachable
  
  d8:                                               ; preds = %0
    unreachable
  
  d9:                                               ; preds = %0
    unreachable
  
  d10:                                              ; preds = %0
    unreachable
  
  d11:                                              ; preds = %0
    unreachable
  
  d12:                                              ; preds = %0
    unreachable
  
  d13:                                              ; preds = %0
    unreachable
  
  d14:                                              ; preds = %0
    unreachable
  
  d15:                                              ; preds = %0
    unreachable
  
  d16:                                              ; preds = %0
    unreachable
  
  d17:                                              ; preds = %0
    unreachable
  }
  
  ; Function Attrs: nounwind
  declare i32 @llvm.arm.space(i32, i32) #0
  
  ; Function Attrs: nounwind
  declare void @llvm.stackprotector(i8*, i8**) #0
  
  attributes #0 = { nounwind }

...
---
name:            foo
alignment:       1
exposesReturnsTwice: false
legalized:       false
regBankSelected: false
selected:        false
tracksRegLiveness: true
liveins:         
  - { reg: '%r0' }
  - { reg: '%r1' }
frameInfo:       
  isFrameAddressTaken: false
  isReturnAddressTaken: false
  hasStackMap:     false
  hasPatchPoint:   false
  stackSize:       0
  offsetAdjustment: 0
  maxAlignment:    0
  adjustsStack:    false
  hasCalls:        false
  maxCallFrameSize: 0
  hasOpaqueSPAdjustment: false
  hasVAStart:      false
  hasMustTailInVarArgFunc: false
constants:       
  - id:              0
    value:           i32 12345678
    alignment:       4
jumpTable:       
  kind:            inline
  entries:         
    - id:              0
      blocks:          [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', 
                         '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', 
                         '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
                         '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
                         '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', 
                         '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', 
                         '%bb.17.d16', '%bb.18.d17' ]
body:             |
  bb.0 (%ir-block.0):
    successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c)
    liveins: %r0, %r1
  
    %r2 = tLDRpci %const.0, 14, %noreg
    tSTRi killed %r2, killed %r1, 0, 14, %noreg :: (store 4 into %ir.addr)
    dead %r1 = SPACE 980, undef %r0
    %r0 = tUXTB killed %r0, 14, %noreg
    %r1, dead %cpsr = tSUBi3 killed %r0, 1, 14, %noreg
    tCMPi8 %r1, 25, 14, %noreg, implicit-def %cpsr
    tBcc %bb.2.d1, 8, killed %cpsr
  
  bb.1 (%ir-block.0):
    successors: %bb.3.d2(0x07c549d2), %bb.9.d8(0x07c549d2), %bb.4.d3(0x07c549d2), %bb.5.d4(0x07c549d2), %bb.6.d5(0x07c549d2), %bb.7.d6(0x07c549d2), %bb.8.d7(0x07c549d2), %bb.10.d9(0x07c549d2), %bb.11.d10(0x07c549d2), %bb.2.d1(0x03ab62db), %bb.12.d11(0x07c549d2), %bb.13.d12(0x07c549d2), %bb.14.d13(0x07c549d2), %bb.15.d14(0x07c549d2), %bb.16.d15(0x07c549d2), %bb.17.d16(0x07c549d2), %bb.18.d17(0x07c549d2)
    liveins: %r1
  
    %r0, dead %cpsr = tLSLri killed %r1, 2, 14, %noreg
    %r1 = tLEApcrelJT %jump-table.0, 14, %noreg
    %r0 = tLDRr killed %r1, killed %r0, 14, %noreg :: (load 4 from jump-table)
    tBR_JTr killed %r0, %jump-table.0
  
  bb.3.d2:
  
  bb.9.d8:
  
  bb.4.d3:
  
  bb.5.d4:
  
  bb.6.d5:
  
  bb.7.d6:
  
  bb.8.d7:
  
  bb.10.d9:
  
  bb.11.d10:
  
  bb.2.d1:
  
  bb.12.d11:
  
  bb.13.d12:
  
  bb.14.d13:
  
  bb.15.d14:
  
  bb.16.d15:
  
  bb.17.d16:
  
  bb.18.d17:

...

---
name:            bar
alignment:       1
exposesReturnsTwice: false
legalized:       false
regBankSelected: false
selected:        false
tracksRegLiveness: true
liveins:         
  - { reg: '%r0' }
  - { reg: '%r1' }
frameInfo:       
  isFrameAddressTaken: false
  isReturnAddressTaken: false
  hasStackMap:     false
  hasPatchPoint:   false
  stackSize:       0
  offsetAdjustment: 0
  maxAlignment:    0
  adjustsStack:    false
  hasCalls:        false
  maxCallFrameSize: 0
  hasOpaqueSPAdjustment: false
  hasVAStart:      false
  hasMustTailInVarArgFunc: false
constants:       
  - id:              0
    value:           i32 12345678
    alignment:       4
jumpTable:       
  kind:            inline
  entries:         
    - id:              0
      blocks:          [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', 
                         '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', 
                         '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
                         '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
                         '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', 
                         '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', 
                         '%bb.17.d16', '%bb.18.d17' ]
body:             |
  bb.0 (%ir-block.0):
    successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c)
    liveins: %r0, %r1
  
    %r2 = tLDRpci %const.0, 14, %noreg
    tSTRi killed %r2, killed %r1, 0, 14, %noreg :: (store 4 into %ir.addr)
    %r0 = tUXTB killed %r0, 14, %noreg
    %r1, dead %cpsr = tSUBi3 killed %r0, 1, 14, %noreg
    tCMPi8 %r1, 25, 14, %noreg, implicit-def %cpsr
    tBcc %bb.2.d1, 8, killed %cpsr
  
  bb.1 (%ir-block.0):
    successors: %bb.3.d2(0x07c549d2), %bb.9.d8(0x07c549d2), %bb.4.d3(0x07c549d2), %bb.5.d4(0x07c549d2), %bb.6.d5(0x07c549d2), %bb.7.d6(0x07c549d2), %bb.8.d7(0x07c549d2), %bb.10.d9(0x07c549d2), %bb.11.d10(0x07c549d2), %bb.2.d1(0x03ab62db), %bb.12.d11(0x07c549d2), %bb.13.d12(0x07c549d2), %bb.14.d13(0x07c549d2), %bb.15.d14(0x07c549d2), %bb.16.d15(0x07c549d2), %bb.17.d16(0x07c549d2), %bb.18.d17(0x07c549d2)
    liveins: %r1
  
    %r0, dead %cpsr = tLSLri killed %r1, 2, 14, %noreg
    %r1 = tLEApcrelJT %jump-table.0, 14, %noreg
    %r0 = tLDRr killed %r1, killed %r0, 14, %noreg :: (load 4 from jump-table)
    tBR_JTr killed %r0, %jump-table.0
  
  bb.3.d2:
  
  bb.9.d8:
  
  bb.4.d3:
  
  bb.5.d4:
  
  bb.6.d5:
  
  bb.7.d6:
  
  bb.8.d7:
  
  bb.10.d9:
  
  bb.11.d10:
  
  bb.2.d1:
  
  bb.12.d11:
  
  bb.13.d12:
  
  bb.14.d13:
  
  bb.15.d14:
  
  bb.16.d15:
  
  bb.17.d16:
  
  bb.18.d17:

...