brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.5 KiB · 3c900c2 Raw
213 lines · plain
1# RUN: llc -mtriple arm-- -run-pass=legalizer %s -o - | FileCheck %s2# RUN: llc -mtriple thumbv7-- -run-pass=legalizer %s -o - | FileCheck %s3--- |4  define void @test_legal_loads_stores() { ret void }5  define void @test_load_store_s1() { ret void }6  define void @test_load_from_stack() { ret void }7 8  define void @test_load_store_64_vfp() #0 { ret void }9  define void @test_load_store_64_novfp() #1 { ret void }10 11  define void @test_gep_s32() { ret void }12 13  attributes #0 = { "target-features"="+vfp2" }14  attributes #1 = { "target-features"="-vfp2sp" }15...16---17name:            test_legal_loads_stores18# CHECK-LABEL: name: test_legal_loads_stores19legalized:       false20# CHECK: legalized: true21regBankSelected: false22selected:        false23tracksRegLiveness: true24registers:25  - { id: 0, class: _ }26  - { id: 1, class: _ }27  - { id: 2, class: _ }28  - { id: 3, class: _ }29  - { id: 4, class: _ }30  - { id: 5, class: _ }31  - { id: 6, class: _ }32body:             |33  bb.0:34    liveins: $r035 36    ; These are all legal, so we should find them unchanged in the output37    ; CHECK-DAG: G_STORE {{%[0-9]+}}(s32), %0(p0) :: (store (s32))38    ; CHECK-DAG: G_STORE {{%[0-9]+}}(s16), %0(p0) :: (store (s16))39    ; CHECK-DAG: G_STORE {{%[0-9]+}}(s8), %0(p0) :: (store (s8))40    ; CHECK-DAG: G_STORE {{%[0-9]+}}(p0), %0(p0)41    ; CHECK-DAG: {{%[0-9]+}}:_(s32) = G_LOAD %0(p0) :: (load (s32))42    ; CHECK-DAG: {{%[0-9]+}}:_(s16) = G_LOAD %0(p0) :: (load (s16))43    ; CHECK-DAG: {{%[0-9]+}}:_(s8) = G_LOAD %0(p0) :: (load (s8))44    ; CHECK-DAG: {{%[0-9]+}}:_(p0) = G_LOAD %0(p0) :: (load (p0))45    %0(p0) = COPY $r046    %2(s32) = G_LOAD %0(p0) :: (load (s32))47    G_STORE %2(s32), %0(p0) :: (store (s32))48    %3(s16) = G_LOAD %0(p0) :: (load (s16))49    G_STORE %3(s16), %0(p0) :: (store (s16))50    %4(s8) = G_LOAD %0(p0) :: (load (s8))51    G_STORE %4(s8), %0(p0) :: (store (s8))52    %6(p0) = G_LOAD %0(p0) :: (load (p0))53    G_STORE %6(p0), %0(p0) :: (store (p0))54    BX_RET 14, $noreg55...56 57---58name:            test_load_store_s159legalized:       false60# CHECK: legalized: true61regBankSelected: false62selected:        false63tracksRegLiveness: true64body:             |65  bb.0:66    liveins: $r067 68    ; CHECK: [[LD:%[0-9]+]]:_(s8) = G_LOAD %0(p0) :: (load (s8))69    ; CHECK: [[ASSERTZ:%[0-9]+]]:_(s8) = G_ASSERT_ZEXT [[LD]], 170    ; CHECK: [[ONE:%[0-9]+]]:_(s32) = G_CONSTANT i32 171    ; CHECK: [[EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ASSERTZ]]72    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[EXT]], [[ONE]]73    ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[AND]]74    ; CHECK: G_STORE [[TRUNC]](s8), {{%[0-9]+}}(p0) :: (store (s8))75    %0:_(p0) = COPY $r076    %5:_(s1) = G_LOAD %0(p0) :: (load (s1))77    G_STORE %5(s1), %0(p0) :: (store (s1))78    BX_RET 14, $noreg79...80---81name:            test_load_from_stack82# CHECK-LABEL: name: test_load_from_stack83legalized:       false84# CHECK: legalized: true85regBankSelected: false86selected:        false87tracksRegLiveness: true88registers:89  - { id: 0, class: _ }90  - { id: 1, class: _ }91  - { id: 2, class: _ }92  - { id: 3, class: _ }93fixedStack:94  - { id: 0, offset: 0, size: 4, alignment: 4, isImmutable: true, isAliased: false }95  - { id: 1, offset: 4, size: 4, alignment: 4, isImmutable: true, isAliased: false }96  - { id: 2, offset: 8, size: 4, alignment: 4, isImmutable: true, isAliased: false }97  # CHECK: id: [[FRAME_INDEX:[0-9]+]], type: default, offset: 898body:             |99  bb.0:100    liveins: $r0, $r1, $r2, $r3101 102    ; This is legal, so we should find it unchanged in the output103    ; CHECK: [[FIVREG:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[FRAME_INDEX]]104    ; CHECK: {{%[0-9]+}}:_(s32) = G_LOAD [[FIVREG]](p0) :: (load (s32))105    %0(p0) = G_FRAME_INDEX %fixed-stack.2106    %1(s32) = G_LOAD %0(p0) :: (load (s32))107    $r0 = COPY %1(s32)108    BX_RET 14, $noreg, implicit $r0109...110---111name:            test_load_store_64_vfp112# CHECK-LABEL: name: test_load_store_64_vfp113legalized:       false114# CHECK: legalized: true115regBankSelected: false116selected:        false117tracksRegLiveness: true118registers:119  - { id: 0, class: _ }120  - { id: 1, class: _ }121  - { id: 2, class: _ }122body:             |123  bb.0:124    liveins: $r0125 126    ; Can't use the VFP support for unaligned operations, we need to use 32-bits127    ; operations instead.128    ; CHECK: [[ADDR1:%[0-9]+]]:_(p0) = COPY $r0129    ; CHECK-NEXT: [[V1:%[0-9]+]]:_(s32) = G_LOAD [[ADDR1]](p0) :: (load (s32), align 1)130    ; CHECK-NEXT: [[OFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 4131    ; CHECK-NEXT: [[ADDR2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR1]], [[OFF]]132    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY [[ADDR2]]133    ; CHECK-NEXT: [[V2:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32) from unknown-address + 4, align 1)134    ; CHECK-NEXT: G_STORE [[V1]](s32), [[ADDR1]](p0) :: (store (s32), align 1)135    ; CHECK-NEXT: G_STORE [[V2]](s32), [[ADDR2]](p0) :: (store (s32) into unknown-address + 4, align 1)136    %0(p0) = COPY $r0137    %1(s64) = G_LOAD %0(p0) :: (load (s64), align 1)138    G_STORE %1(s64), %0(p0) :: (store (s64), align 1)139 140    ; For word-aligned we can use VFP operations.141    ; CHECK: [[V:%[0-9]+]]:_(s64) = G_LOAD %0(p0) :: (load (s64), align 4)142    ; CHECK: G_STORE [[V]](s64), %0(p0) :: (store (s64), align 4)143    %2(s64) = G_LOAD %0(p0) :: (load (s64), align 4)144    G_STORE %2(s64), %0(p0) :: (store (s64), align 4)145 146    BX_RET 14, $noreg147...148---149name:            test_load_store_64_novfp150# CHECK-LABEL: name: test_load_store_64_novfp151legalized:       false152# CHECK: legalized: true153regBankSelected: false154selected:        false155tracksRegLiveness: true156registers:157  - { id: 0, class: _ }158  - { id: 1, class: _ }159  - { id: 2, class: _ }160body:             |161  bb.0:162    liveins: $r0163 164    ; When we don't have VFP support, we need to use 32-bit operations.165    ; CHECK: [[ADDR1:%[0-9]+]]:_(p0) = COPY $r0166    ; CHECK-NEXT: [[V1:%[0-9]+]]:_(s32) = G_LOAD [[ADDR1]](p0) :: (load (s32), align 1)167    ; CHECK-NEXT: [[OFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 4168    ; CHECK-NEXT: [[ADDR2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR1]], [[OFF]]169    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY [[ADDR2]]170    ; CHECK-NEXT: [[V2:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32) from unknown-address + 4, align 1)171    ; CHECK-NEXT: G_STORE [[V1]](s32), [[ADDR1]](p0) :: (store (s32), align 1)172    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY [[ADDR2]]173    ; CHECK-NEXT: G_STORE [[V2]](s32), [[COPY2]](p0) :: (store (s32) into unknown-address + 4, align 1)174    %0(p0) = COPY $r0175    %1(s64) = G_LOAD %0(p0) :: (load (s64), align 1)176    G_STORE %1(s64), %0(p0) :: (store (s64), align 1)177 178    ; CHECK: [[V1:%[0-9]+]]:_(s32) = G_LOAD [[ADDR1]](p0) :: (load (s32))179    ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(p0) = COPY [[ADDR2]]180    ; CHECK-NEXT: [[V2:%[0-9]+]]:_(s32) = G_LOAD [[COPY3]](p0) :: (load (s32) from unknown-address + 4)181    ; CHECK-NEXT: G_STORE [[V1]](s32), [[ADDR1]](p0) :: (store (s32))182    ; CHECK-NEXT: G_STORE [[V2]](s32), [[ADDR2]](p0) :: (store (s32) into unknown-address + 4)183    %2(s64) = G_LOAD %0(p0) :: (load (s64), align 4)184    G_STORE %2(s64), %0(p0) :: (store (s64), align 4)185 186    BX_RET 14, $noreg187...188---189name:            test_gep_s32190# CHECK-LABEL: name: test_gep_s32191legalized:       false192# CHECK: legalized: true193regBankSelected: false194selected:        false195tracksRegLiveness: true196registers:197  - { id: 0, class: _ }198  - { id: 1, class: _ }199  - { id: 2, class: _ }200body:             |201  bb.0:202    liveins: $r0, $r1203 204    %0(p0) = COPY $r0205    %1(s32) = COPY $r1206 207    ; CHECK: {{%[0-9]+}}:_(p0) = G_PTR_ADD {{%[0-9]+}}, {{%[0-9]+}}(s32)208    %2(p0) = G_PTR_ADD %0, %1(s32)209 210    $r0 = COPY %2(p0)211    BX_RET 14, $noreg, implicit $r0212...213