| OLD | NEW |
| 1 ; Tests basics and corner cases of arm32 sandboxing, using -Om1 in the hope that | 1 ; Tests basics and corner cases of arm32 sandboxing, using -Om1 in the hope that |
| 2 ; the output will remain stable. When packing bundles, we try to limit to a few | 2 ; the output will remain stable. When packing bundles, we try to limit to a few |
| 3 ; instructions with well known sizes and minimal use of registers and stack | 3 ; instructions with well known sizes and minimal use of registers and stack |
| 4 ; slots in the lowering sequence. | 4 ; slots in the lowering sequence. |
| 5 | 5 |
| 6 ; REQUIRES: allow_dump, target_ARM32 | 6 ; REQUIRES: allow_dump, target_ARM32 |
| 7 ; RUN: %p2i -i %s --sandbox --filetype=asm --target=arm32 --assemble \ | 7 ; RUN: %p2i -i %s --sandbox --filetype=asm --target=arm32 --assemble \ |
| 8 ; RUN: --disassemble --args -Om1 -allow-externally-defined-symbols \ | 8 ; RUN: --disassemble --args -Om1 -allow-externally-defined-symbols \ |
| 9 ; RUN: -ffunction-sections | FileCheck %s | 9 ; RUN: -ffunction-sections | FileCheck %s |
| 10 | 10 |
| 11 declare void @call_target() | 11 declare void @call_target() |
| 12 declare void @call_target1(i32 %arg) | 12 declare void @call_target1(i32 %arg0) |
| 13 declare void @call_target2(i32 %arg0, i32 %arg1) |
| 14 declare void @call_target3(i32 %arg0, i32 %arg1, i32 %arg2) |
| 13 @global_short = internal global [2 x i8] zeroinitializer | 15 @global_short = internal global [2 x i8] zeroinitializer |
| 14 | 16 |
| 15 ; A direct call sequence uses the right mask and register-call sequence. | 17 ; A direct call sequence uses the right mask and register-call sequence. |
| 16 define internal void @test_direct_call() { | 18 define internal void @test_direct_call() { |
| 17 entry: | 19 entry: |
| 18 call void @call_target() | 20 call void @call_target() |
| 19 ret void | 21 ret void |
| 20 } | 22 } |
| 21 ; CHECK-LABEL: test_direct_call | 23 ; CHECK-LABEL: test_direct_call |
| 22 ; CHECK: sub sp, | 24 ; CHECK: sub sp, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 53 ; Bundle lock without padding. | 55 ; Bundle lock without padding. |
| 54 define internal void @bundle_lock_without_padding() { | 56 define internal void @bundle_lock_without_padding() { |
| 55 entry: | 57 entry: |
| 56 %addr_short = bitcast [2 x i8]* @global_short to i16* | 58 %addr_short = bitcast [2 x i8]* @global_short to i16* |
| 57 store i16 0, i16* %addr_short, align 1 | 59 store i16 0, i16* %addr_short, align 1 |
| 58 ret void | 60 ret void |
| 59 } | 61 } |
| 60 ; CHECK-LABEL: bundle_lock_without_padding | 62 ; CHECK-LABEL: bundle_lock_without_padding |
| 61 ; CHECK: 0: {{.*}} movw | 63 ; CHECK: 0: {{.*}} movw |
| 62 ; CHECK-NEXT: movt | 64 ; CHECK-NEXT: movt |
| 63 ; CHECK-NEXT: movw | 65 ; CHECK-NEXT: mov |
| 64 ; CHECK-NEXT: nop | 66 ; CHECK-NEXT: nop |
| 65 ; CHECK-NEXT: bic [[REG:r[0-9]+]], {{.*}} 0xc0000000 | 67 ; CHECK-NEXT: bic [[REG:r[0-9]+]], {{.*}} 0xc0000000 |
| 66 ; CHECK-NEXT: strh {{.*}}, {{[[]}}[[REG]] | 68 ; CHECK-NEXT: strh {{.*}}, {{[[]}}[[REG]] |
| 67 ; CHECK-NEXT: bic lr, lr, {{.*}} ; 0xc000000f | 69 ; CHECK-NEXT: bic lr, lr, {{.*}} ; 0xc000000f |
| 68 ; CHECK-NEXT: {{.*}} bx lr | 70 ; CHECK-NEXT: {{.*}} bx lr |
| 69 | 71 |
| 70 ; Bundle lock with padding. | 72 ; Bundle lock with padding. |
| 71 define internal void @bundle_lock_with_padding() { | 73 define internal void @bundle_lock_with_padding() { |
| 72 entry: | 74 entry: |
| 73 call void @call_target() | 75 call void @call_target() |
| (...skipping 10 matching lines...) Expand all Loading... |
| 84 ; CHECK: 48: {{.*}} pop | 86 ; CHECK: 48: {{.*}} pop |
| 85 ; CHECK-NEXT: nop | 87 ; CHECK-NEXT: nop |
| 86 ; CHECK-NEXT: bic lr, {{.*}} 0xc000000f | 88 ; CHECK-NEXT: bic lr, {{.*}} 0xc000000f |
| 87 ; CHECK-NEXT: {{.*}} bx lr | 89 ; CHECK-NEXT: {{.*}} bx lr |
| 88 | 90 |
| 89 ; Bundle lock align_to_end without any padding. | 91 ; Bundle lock align_to_end without any padding. |
| 90 define internal void @bundle_lock_align_to_end_padding_0() { | 92 define internal void @bundle_lock_align_to_end_padding_0() { |
| 91 entry: | 93 entry: |
| 92 call void @call_target() | 94 call void @call_target() |
| 93 ; bundle boundary | 95 ; bundle boundary |
| 94 store i16 0, i16* undef, align 1 | 96 call void @call_target3(i32 1, i32 2, i32 3) |
| 95 call void @call_target() | |
| 96 ; bundle boundary | 97 ; bundle boundary |
| 97 ret void | 98 ret void |
| 98 } | 99 } |
| 99 ; CHECK-LABEL: bundle_lock_align_to_end_padding_0 | 100 ; CHECK-LABEL: bundle_lock_align_to_end_padding_0 |
| 100 ; CHECK: c: {{.*}} bl {{.*}} call_target | 101 ; CHECK: c: {{.*}} bl {{.*}} call_target |
| 101 ; CHECK-NEXT: movw | 102 ; CHECK-NEXT: mov |
| 102 ; CHECK-NEXT: movw | 103 ; CHECK-NEXT: mov |
| 103 ; CHECK-NEXT: bic [[REG:r[0-9]+]] | 104 ; CHECK-NEXT: mov |
| 104 ; CHECK-NEXT: strh {{.*}}, {{[[]}}[[REG]] | 105 ; CHECK-NEXT: {{[0-9]+}}c: {{.*}} bl {{.*}} call_target3 |
| 105 ; CHECK: {{[0-9]+}}c: {{.*}} bl {{.*}} call_target | |
| 106 ; CHECK-NEXT: add sp | 106 ; CHECK-NEXT: add sp |
| 107 ; CHECK-NEXT: bic sp, {{.*}} 0xc0000000 | 107 ; CHECK-NEXT: bic sp, {{.*}} 0xc0000000 |
| 108 ; CHECK-NEXT: pop | 108 ; CHECK-NEXT: pop |
| 109 ; CHECK: {{[0-9]+}}0: {{.*}} bic lr, lr, {{.*}} 0xc000000f | 109 ; CHECK: {{[0-9]+}}0: {{.*}} bic lr, lr, {{.*}} 0xc000000f |
| 110 ; CHECK-NEXT: {{.*}} bx lr | 110 ; CHECK-NEXT: {{.*}} bx lr |
| 111 | 111 |
| 112 ; Bundle lock align_to_end with one bunch of padding. | 112 ; Bundle lock align_to_end with one bunch of padding. |
| 113 define internal void @bundle_lock_align_to_end_padding_1() { | 113 define internal void @bundle_lock_align_to_end_padding_1() { |
| 114 entry: | 114 entry: |
| 115 call void @call_target() | 115 call void @call_target() |
| 116 ; bundle boundary | 116 ; bundle boundary |
| 117 store i32 65536, i32* undef, align 1 | 117 call void @call_target2(i32 1, i32 2) |
| 118 ; bundle boundary | |
| 119 call void @call_target() | |
| 120 ; bundle boundary | 118 ; bundle boundary |
| 121 ret void | 119 ret void |
| 122 } | 120 } |
| 123 ; CHECK-LABEL: bundle_lock_align_to_end_padding_1 | 121 ; CHECK-LABEL: bundle_lock_align_to_end_padding_1 |
| 124 ; CHECK: {{[0-9]*}}c: {{.*}} bl {{.*}} call_target | 122 ; CHECK: {{[0-9]*}}c: {{.*}} bl {{.*}} call_target |
| 125 ; CHECK-NEXT: movw [[BASE:r[0-9]+]] | 123 ; CHECK-NEXT: mov |
| 126 ; CHECK-NEXT: movw [[REG:r[0-9]+]], #0 | 124 ; CHECK-NEXT: mov |
| 127 ; CHECK-NEXT: movt [[REG]], #1 | |
| 128 ; CHECK-NEXT: nop | 125 ; CHECK-NEXT: nop |
| 129 ; CHECK-NEXT: bic [[BASE]], [[BASE]], {{.*}} 0xc0000000 | 126 ; CHECK-NEXT: bl {{.*}} call_target2 |
| 130 ; CHECK-NEXT: str [[REG]], {{[[]}}[[BASE]] | |
| 131 ; CHECK-NEXT: nop | |
| 132 ; CHECK-NEXT: bl {{.*}} call_target | |
| 133 ; CHECK: {{[0-9]+}}0: {{.*}} bic lr, lr, {{.*}} 0xc000000f | 127 ; CHECK: {{[0-9]+}}0: {{.*}} bic lr, lr, {{.*}} 0xc000000f |
| 134 ; CHECK-NEXT: {{.*}} bx lr | 128 ; CHECK-NEXT: {{.*}} bx lr |
| 135 | 129 |
| 136 ; Bundle lock align_to_end with two bunches of padding. | 130 ; Bundle lock align_to_end with two bunches of padding. |
| 137 define internal void @bundle_lock_align_to_end_padding_2(i32 %target) { | 131 define internal void @bundle_lock_align_to_end_padding_2() { |
| 138 entry: | 132 entry: |
| 139 call void @call_target1(i32 1) | 133 call void @call_target2(i32 1, i32 2) |
| 140 ; bundle boundary | 134 ; bundle boundary |
| 141 %__1 = inttoptr i32 %target to void (i32, i32, i32)* | |
| 142 call void %__1(i32 2, i32 3, i32 4) | |
| 143 ret void | 135 ret void |
| 144 } | 136 } |
| 145 ; CHECK-LABEL: bundle_lock_align_to_end_padding_2 | 137 ; CHECK-LABEL: bundle_lock_align_to_end_padding_2 |
| 146 ; CHECK: {{[0-9]+}}0: | 138 ; CHECK: mov |
| 139 ; CHECK-NEXT: mov |
| 147 ; CHECK-NEXT: nop | 140 ; CHECK-NEXT: nop |
| 148 ; CHECK-NEXT: nop | 141 ; CHECK-NEXT: nop |
| 149 ; CHECK-NEXT: bl {{.*}} call_target | 142 ; CHECK-NEXT: bl {{.*}} call_target2 |
| 150 ; CHECK: {{[0-9]+}}c: {{.*}} movw r2, #4 | |
| 151 ; CHECK-NEXT: nop | |
| 152 ; CHECK-NEXT: nop | |
| 153 ; CHECK-NEXT: bic [[REG:r[0-9]+]], [[REG]], {{.*}} 0xc000000f | |
| 154 ; CHECK-NEXT: {{.*}} blx [[REG]] | |
| OLD | NEW |