107 lines · plain
1; Test for generation of jump table for ropi/rwpi2 3; RUN: llc -relocation-model=static -mtriple=armv7a--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM --check-prefix=ARM_ABS4; RUN: llc -relocation-model=ropi -mtriple=armv7a--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM --check-prefix=ARM_PC5; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM --check-prefix=ARM_PC6 7; RUN: llc -relocation-model=static -mtriple=thumbv7m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB28; RUN: llc -relocation-model=ropi -mtriple=thumbv7m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB29; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB210 11; RUN: llc -relocation-model=static -mtriple=thumbv6m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB112; RUN: llc -relocation-model=ropi -mtriple=thumbv6m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB113; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv6m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB114 15 16declare void @exit0()17declare void @exit1()18declare void @exit2()19declare void @exit3()20declare void @exit4()21define void @jump_table(i32 %val) {22entry:23 switch i32 %val, label %default [ i32 1, label %lab124 i32 2, label %lab225 i32 3, label %lab326 i32 4, label %lab4 ]27 28default:29 tail call void @exit0()30 ret void31 32lab1:33 tail call void @exit1()34 ret void35 36lab2:37 tail call void @exit2()38 ret void39 40lab3:41 tail call void @exit3()42 ret void43 44lab4:45 tail call void @exit4()46 ret void47 48; CHECK-LABEL: jump_table:49 50; ARM: adr r[[R_TAB_BASE:[0-9]+]], [[LJTI:\.LJTI[0-9]+_[0-9]+]]51; ARM_ABS: ldr pc, [r[[R_TAB_BASE]], r{{[0-9]+}}, lsl #2]52; ARM_PC: ldr r[[R_OFFSET:[0-9]+]], [r[[R_TAB_BASE]], r{{[0-9]+}}, lsl #2]53; ARM_PC: add pc, r[[R_TAB_BASE]], r[[R_OFFSET]]54; ARM: [[LJTI]]55; ARM_ABS: .long [[LBB1:\.LBB[0-9]+_[0-9]+]]56; ARM_ABS: .long [[LBB2:\.LBB[0-9]+_[0-9]+]]57; ARM_ABS: .long [[LBB3:\.LBB[0-9]+_[0-9]+]]58; ARM_ABS: .long [[LBB4:\.LBB[0-9]+_[0-9]+]]59; ARM_PC: .long [[LBB1:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]60; ARM_PC: .long [[LBB2:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]61; ARM_PC: .long [[LBB3:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]62; ARM_PC: .long [[LBB4:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]63; ARM: [[LBB1]]64; ARM-NEXT: b exit165; ARM: [[LBB2]]66; ARM-NEXT: b exit267; ARM: [[LBB3]]68; ARM-NEXT: b exit369; ARM: [[LBB4]]70; ARM-NEXT: b exit471 72; THUMB2: [[LCPI:\.LCPI[0-9]+_[0-9]+]]:73; THUMB2: tbb [pc, r{{[0-9]+}}]74; THUMB2: .byte ([[LBB1:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/275; THUMB2: .byte ([[LBB2:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/276; THUMB2: .byte ([[LBB3:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/277; THUMB2: .byte ([[LBB4:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/278; THUMB2: [[LBB1]]79; THUMB2-NEXT: b exit180; THUMB2: [[LBB2]]81; THUMB2-NEXT: b exit282; THUMB2: [[LBB3]]83; THUMB2-NEXT: b exit384; THUMB2: [[LBB4]]85; THUMB2-NEXT: b exit486 87; THUMB1: .p2align 288; THUMB1: add r[[x:[0-9]+]], pc89; THUMB1: ldrb r[[x]], [r[[x]], #4]90; THUMB1: lsls r[[x]], r[[x]], #191; THUMB1: [[LCPI:\.LCPI[0-9]+_[0-9]+]]:92; THUMB1: add pc, r[[x]]93; THUMB1: .p2align 294; THUMB1: .byte ([[LBB1:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/295; THUMB1: .byte ([[LBB2:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/296; THUMB1: .byte ([[LBB3:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/297; THUMB1: .byte ([[LBB4:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/298; THUMB1: [[LBB1]]99; THUMB1-NEXT: bl exit1100; THUMB1: [[LBB2]]101; THUMB1-NEXT: bl exit2102; THUMB1: [[LBB3]]103; THUMB1-NEXT: bl exit3104; THUMB1: [[LBB4]]105; THUMB1-NEXT: bl exit4106}107