OLD | NEW |
1 ; Test of multiple indirect calls to the same target. Each call | 1 ; Test of multiple indirect calls to the same target. Each call |
2 ; should be to the same operand, whether it's in a register or on the | 2 ; should be to the same operand, whether it's in a register or on the |
3 ; stack. | 3 ; stack. |
4 | 4 |
5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
6 ; RUN: --target x8632 -i %s --args -O2 \ | 6 ; RUN: --target x8632 -i %s --args -O2 \ |
7 ; RUN: | %if --need=target_X8632 --command FileCheck %s | 7 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
8 ; RUN: %if --need=allow_dump --need=target_X8632 --command %p2i --filetype=asm \ | 8 ; RUN: %if --need=allow_dump --need=target_X8632 --command %p2i --filetype=asm \ |
9 ; RUN: --assemble --disassemble -i %s --args -O2 \ | 9 ; RUN: --assemble --disassemble -i %s --args -O2 \ |
10 ; RUN: | %if --need=allow_dump --need=target_X8632 --command FileCheck %s | 10 ; RUN: | %if --need=allow_dump --need=target_X8632 --command FileCheck %s |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | 44 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 |
45 | 45 |
46 define internal void @CallIndirect(i32 %f) { | 46 define internal void @CallIndirect(i32 %f) { |
47 entry: | 47 entry: |
48 %__1 = inttoptr i32 %f to void ()* | 48 %__1 = inttoptr i32 %f to void ()* |
49 call void %__1() | 49 call void %__1() |
50 call void %__1() | 50 call void %__1() |
51 call void %__1() | 51 call void %__1() |
52 call void %__1() | 52 call void %__1() |
53 call void %__1() | 53 call void %__1() |
| 54 call void %__1() |
54 ret void | 55 ret void |
55 } | 56 } |
56 ; CHECK-LABEL: CallIndirect | 57 ; CHECK-LABEL: CallIndirect |
| 58 ; Use the first call as a barrier in case the register allocator decides to use |
| 59 ; a scratch register for it but a common preserved register for the rest. |
| 60 ; CHECK: call |
57 ; CHECK: call [[REGISTER:[a-z]+]] | 61 ; CHECK: call [[REGISTER:[a-z]+]] |
58 ; CHECK: call [[REGISTER]] | 62 ; CHECK: call [[REGISTER]] |
59 ; CHECK: call [[REGISTER]] | 63 ; CHECK: call [[REGISTER]] |
60 ; CHECK: call [[REGISTER]] | 64 ; CHECK: call [[REGISTER]] |
61 ; CHECK: call [[REGISTER]] | 65 ; CHECK: call [[REGISTER]] |
62 ; | 66 ; |
63 ; OPTM1-LABEL: CallIndirect | 67 ; OPTM1-LABEL: CallIndirect |
64 ; OPTM1: call [[TARGET:.+]] | 68 ; OPTM1: call [[TARGET:.+]] |
65 ; OPTM1: call [[TARGET]] | 69 ; OPTM1: call [[TARGET]] |
66 ; OPTM1: call [[TARGET]] | 70 ; OPTM1: call [[TARGET]] |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 ; e8 00 00 00 00 call {{.*}} *ABS*+0x103bc | 186 ; e8 00 00 00 00 call {{.*}} *ABS*+0x103bc |
183 ; | 187 ; |
184 ; ARM32-LABEL: CallConst | 188 ; ARM32-LABEL: CallConst |
185 ; ARM32: movw [[REGISTER:r.*]], #960 | 189 ; ARM32: movw [[REGISTER:r.*]], #960 |
186 ; ARM32: movt [[REGISTER]], #1 | 190 ; ARM32: movt [[REGISTER]], #1 |
187 ; ARM32: blx [[REGISTER]] | 191 ; ARM32: blx [[REGISTER]] |
188 ; The legalization of the constant could be shared, but it isn't. | 192 ; The legalization of the constant could be shared, but it isn't. |
189 ; ARM32: movw [[REGISTER:r.*]], #960 | 193 ; ARM32: movw [[REGISTER:r.*]], #960 |
190 ; ARM32: blx [[REGISTER]] | 194 ; ARM32: blx [[REGISTER]] |
191 ; ARM32: blx [[REGISTER]] | 195 ; ARM32: blx [[REGISTER]] |
OLD | NEW |