xref: /llvm-project/llvm/test/CodeGen/ARM/ipra-exact-definition.ll (revision 0ed7732671b2b619937adc13376f89f52f2db572)
1*0ed77326SOliver Stannard; RUN: llc -mtriple armv7a--none-eabi < %s -enable-ipra | FileCheck %s
2*0ed77326SOliver Stannard
3*0ed77326SOliver Stannard; A linkone_odr function (the same applies to available_externally, linkonce,
4*0ed77326SOliver Stannard; weak, common, extern_weak and weak_odr) could be replaced with a
5*0ed77326SOliver Stannard; differently-compiled version of the same source at link time, which might use
6*0ed77326SOliver Stannard; different registers, so we can't do IPRA on it.
7*0ed77326SOliver Stannarddefine linkonce_odr void @leaf_linkonce_odr() {
8*0ed77326SOliver Stannardentry:
9*0ed77326SOliver Stannard  ret void
10*0ed77326SOliver Stannard}
11*0ed77326SOliver Stannarddefine void @test_linkonce_odr() {
12*0ed77326SOliver Stannard; CHECK-LABEL: test_linkonce_odr:
13*0ed77326SOliver Stannardentry:
14*0ed77326SOliver Stannard; CHECK: ASM1: r3
15*0ed77326SOliver Stannard; CHECK: mov   [[TEMP:r[0-9]+]], r3
16*0ed77326SOliver Stannard; CHECK: bl    leaf_linkonce_odr
17*0ed77326SOliver Stannard; CHECK: mov   r3, [[TEMP]]
18*0ed77326SOliver Stannard; CHECK: ASM2: r3
19*0ed77326SOliver Stannard  %0 = tail call i32 asm sideeffect "// ASM1: $0", "={r3},0"(i32 undef)
20*0ed77326SOliver Stannard  tail call void @leaf_linkonce_odr()
21*0ed77326SOliver Stannard  %1 = tail call i32 asm sideeffect "// ASM2: $0", "={r3},0"(i32 %0)
22*0ed77326SOliver Stannard  ret void
23*0ed77326SOliver Stannard}
24*0ed77326SOliver Stannard
25*0ed77326SOliver Stannard; This function has external linkage (the same applies to private, internal and
26*0ed77326SOliver Stannard; appending), so the version we see here is guaranteed to be the version
27*0ed77326SOliver Stannard; selected by the linker, so we can do IPRA.
28*0ed77326SOliver Stannarddefine external void @leaf_external() {
29*0ed77326SOliver Stannardentry:
30*0ed77326SOliver Stannard  ret void
31*0ed77326SOliver Stannard}
32*0ed77326SOliver Stannarddefine void @test_external() {
33*0ed77326SOliver Stannard; CHECK-LABEL: test_external:
34*0ed77326SOliver Stannardentry:
35*0ed77326SOliver Stannard; CHECK: ASM1: r3
36*0ed77326SOliver Stannard; CHECK-NOT:   r3
37*0ed77326SOliver Stannard; CHECK: bl    leaf_external
38*0ed77326SOliver Stannard; CHECK-NOT:   r3
39*0ed77326SOliver Stannard; CHECK: ASM2: r3
40*0ed77326SOliver Stannard  %0 = tail call i32 asm sideeffect "// ASM1: $0", "={r3},0"(i32 undef)
41*0ed77326SOliver Stannard  tail call void @leaf_external()
42*0ed77326SOliver Stannard  %1 = tail call i32 asm sideeffect "// ASM2: $0", "={r3},0"(i32 %0)
43*0ed77326SOliver Stannard  ret void
44*0ed77326SOliver Stannard}
45