1*9880d681SAndroid Build Coastguard Worker# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker# This test ensures that the MIR parser parses the jump table info and jump 3*9880d681SAndroid Build Coastguard Worker# table operands correctly. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker--- | 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker define i32 @test_jumptable(i32 %in) { 8*9880d681SAndroid Build Coastguard Worker entry: 9*9880d681SAndroid Build Coastguard Worker switch i32 %in, label %def [ 10*9880d681SAndroid Build Coastguard Worker i32 0, label %lbl1 11*9880d681SAndroid Build Coastguard Worker i32 1, label %lbl2 12*9880d681SAndroid Build Coastguard Worker i32 2, label %lbl3 13*9880d681SAndroid Build Coastguard Worker i32 3, label %lbl4 14*9880d681SAndroid Build Coastguard Worker ] 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker def: 17*9880d681SAndroid Build Coastguard Worker ret i32 0 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker lbl1: 20*9880d681SAndroid Build Coastguard Worker ret i32 1 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker lbl2: 23*9880d681SAndroid Build Coastguard Worker ret i32 2 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker lbl3: 26*9880d681SAndroid Build Coastguard Worker ret i32 4 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker lbl4: 29*9880d681SAndroid Build Coastguard Worker ret i32 8 30*9880d681SAndroid Build Coastguard Worker } 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker define i32 @test_jumptable2(i32 %in) { 33*9880d681SAndroid Build Coastguard Worker entry: 34*9880d681SAndroid Build Coastguard Worker switch i32 %in, label %def [ 35*9880d681SAndroid Build Coastguard Worker i32 0, label %lbl1 36*9880d681SAndroid Build Coastguard Worker i32 1, label %lbl2 37*9880d681SAndroid Build Coastguard Worker i32 2, label %lbl3 38*9880d681SAndroid Build Coastguard Worker i32 3, label %lbl4 39*9880d681SAndroid Build Coastguard Worker ] 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker def: 42*9880d681SAndroid Build Coastguard Worker ret i32 0 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker lbl1: 45*9880d681SAndroid Build Coastguard Worker ret i32 1 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker lbl2: 48*9880d681SAndroid Build Coastguard Worker ret i32 2 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker lbl3: 51*9880d681SAndroid Build Coastguard Worker ret i32 4 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker lbl4: 54*9880d681SAndroid Build Coastguard Worker ret i32 8 55*9880d681SAndroid Build Coastguard Worker } 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker... 58*9880d681SAndroid Build Coastguard Worker--- 59*9880d681SAndroid Build Coastguard Workername: test_jumptable 60*9880d681SAndroid Build Coastguard Worker# CHECK: jumpTable: 61*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: kind: label-difference32 62*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: entries: 63*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: - id: 0 64*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: blocks: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ] 65*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: body: 66*9880d681SAndroid Build Coastguard WorkerjumpTable: 67*9880d681SAndroid Build Coastguard Worker kind: label-difference32 68*9880d681SAndroid Build Coastguard Worker entries: 69*9880d681SAndroid Build Coastguard Worker - id: 0 70*9880d681SAndroid Build Coastguard Worker blocks: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ] 71*9880d681SAndroid Build Coastguard Workerbody: | 72*9880d681SAndroid Build Coastguard Worker bb.0.entry: 73*9880d681SAndroid Build Coastguard Worker successors: %bb.2.def, %bb.1.entry 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker %eax = MOV32rr %edi, implicit-def %rax 76*9880d681SAndroid Build Coastguard Worker CMP32ri8 %edi, 3, implicit-def %eflags 77*9880d681SAndroid Build Coastguard Worker JA_1 %bb.2.def, implicit %eflags 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker bb.1.entry: 80*9880d681SAndroid Build Coastguard Worker successors: %bb.3.lbl1, %bb.4.lbl2, %bb.5.lbl3, %bb.6.lbl4 81*9880d681SAndroid Build Coastguard Worker ; CHECK: %rcx = LEA64r %rip, 1, _, %jump-table.0, _ 82*9880d681SAndroid Build Coastguard Worker %rcx = LEA64r %rip, 1, _, %jump-table.0, _ 83*9880d681SAndroid Build Coastguard Worker %rax = MOVSX64rm32 %rcx, 4, %rax, 0, _ 84*9880d681SAndroid Build Coastguard Worker %rax = ADD64rr %rax, %rcx, implicit-def %eflags 85*9880d681SAndroid Build Coastguard Worker JMP64r %rax 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker bb.2.def: 88*9880d681SAndroid Build Coastguard Worker %eax = MOV32r0 implicit-def %eflags 89*9880d681SAndroid Build Coastguard Worker RETQ %eax 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker bb.3.lbl1: 92*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 1 93*9880d681SAndroid Build Coastguard Worker RETQ %eax 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker bb.4.lbl2: 96*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 2 97*9880d681SAndroid Build Coastguard Worker RETQ %eax 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker bb.5.lbl3: 100*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 4 101*9880d681SAndroid Build Coastguard Worker RETQ %eax 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker bb.6.lbl4: 104*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 8 105*9880d681SAndroid Build Coastguard Worker RETQ %eax 106*9880d681SAndroid Build Coastguard Worker... 107*9880d681SAndroid Build Coastguard Worker--- 108*9880d681SAndroid Build Coastguard Workername: test_jumptable2 109*9880d681SAndroid Build Coastguard WorkerjumpTable: 110*9880d681SAndroid Build Coastguard Worker kind: label-difference32 111*9880d681SAndroid Build Coastguard Worker entries: 112*9880d681SAndroid Build Coastguard Worker - id: 1 113*9880d681SAndroid Build Coastguard Worker blocks: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ] 114*9880d681SAndroid Build Coastguard Workerbody: | 115*9880d681SAndroid Build Coastguard Worker bb.0.entry: 116*9880d681SAndroid Build Coastguard Worker successors: %bb.2.def, %bb.1.entry 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker %eax = MOV32rr %edi, implicit-def %rax 119*9880d681SAndroid Build Coastguard Worker CMP32ri8 %edi, 3, implicit-def %eflags 120*9880d681SAndroid Build Coastguard Worker JA_1 %bb.2.def, implicit %eflags 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker bb.1.entry: 123*9880d681SAndroid Build Coastguard Worker successors: %bb.3.lbl1, %bb.4.lbl2, %bb.5.lbl3, %bb.6.lbl4 124*9880d681SAndroid Build Coastguard Worker ; Verify that the printer will use an id of 0 for this jump table: 125*9880d681SAndroid Build Coastguard Worker ; CHECK: %rcx = LEA64r %rip, 1, _, %jump-table.0, _ 126*9880d681SAndroid Build Coastguard Worker %rcx = LEA64r %rip, 1, _, %jump-table.1, _ 127*9880d681SAndroid Build Coastguard Worker %rax = MOVSX64rm32 %rcx, 4, %rax, 0, _ 128*9880d681SAndroid Build Coastguard Worker %rax = ADD64rr %rax, %rcx, implicit-def %eflags 129*9880d681SAndroid Build Coastguard Worker JMP64r %rax 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker bb.2.def: 132*9880d681SAndroid Build Coastguard Worker %eax = MOV32r0 implicit-def %eflags 133*9880d681SAndroid Build Coastguard Worker RETQ %eax 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker bb.3.lbl1: 136*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 1 137*9880d681SAndroid Build Coastguard Worker RETQ %eax 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker bb.4.lbl2: 140*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 2 141*9880d681SAndroid Build Coastguard Worker RETQ %eax 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker bb.5.lbl3: 144*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 4 145*9880d681SAndroid Build Coastguard Worker RETQ %eax 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker bb.6.lbl4: 148*9880d681SAndroid Build Coastguard Worker %eax = MOV32ri 8 149*9880d681SAndroid Build Coastguard Worker RETQ %eax 150*9880d681SAndroid Build Coastguard Worker... 151