Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Prevent devirtualization of calls to un-instantiated functions.
PR 27895 Differential Revision: https://reviews.llvm.org/D22057 llvm-svn: 305862
- Loading branch information
Sunil Srivastava
committed
Jun 20, 2017
1 parent
0d93185
commit 15ed292
Showing
6 changed files
with
89 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// RUN: %clang_cc1 %s -DUSEIT -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s | ||
|
||
// Test with decls and template defs in pch, and just use in .cpp | ||
// RUN: %clang_cc1 %s -DTMPL_DEF_IN_HEADER -triple %itanium_abi_triple -emit-pch -o %t | ||
// RUN: %clang_cc1 %s -DTMPL_DEF_IN_HEADER -DUSEIT -triple %itanium_abi_triple -include-pch %t -emit-llvm -o - | FileCheck %s | ||
|
||
// Test with A in pch, and B and C in main | ||
// Test with just decls in pch, and template defs and use in .cpp | ||
// RUN: %clang_cc1 %s -triple %itanium_abi_triple -emit-pch -o %t | ||
// RUN: %clang_cc1 %s -DUSEIT -triple %itanium_abi_triple -include-pch %t -emit-llvm -o - | FileCheck %s | ||
|
||
#ifndef HEADER | ||
#define HEADER | ||
template < typename T, int N = 0 > class TmplWithArray { | ||
public: | ||
virtual T& operator [] (int idx); | ||
virtual T& func1 (int idx); | ||
virtual T& func2 (int idx); | ||
T ar[N+1]; | ||
}; | ||
struct Wrapper { | ||
TmplWithArray<bool, 10> data; | ||
bool indexIt(int a) { | ||
if (a > 6) return data[a] ; // Should not devirtualize | ||
if (a > 4) return data.func1(a); // Should devirtualize | ||
return data.func2(a); // Should devirtualize | ||
} | ||
}; | ||
|
||
#ifdef TMPL_DEF_IN_HEADER | ||
template <typename T, int N> T& TmplWithArray<T, N >::operator[](int idx) { | ||
return ar[idx]; | ||
} | ||
template <typename T, int N> T& TmplWithArray<T, N >::func1(int idx) { | ||
return ar[idx]; | ||
} | ||
#endif // TMPL_DEF_IN_HEADER | ||
#endif // HEADER | ||
|
||
#ifdef USEIT | ||
#ifndef TMPL_DEF_IN_HEADER | ||
template <typename T, int N> T& TmplWithArray<T, N >::operator[](int idx) { | ||
return ar[idx]; | ||
} | ||
template <typename T, int N> T& TmplWithArray<T, N >::func1(int idx) { | ||
return ar[idx]; | ||
} | ||
#endif // !TMPL_DEF_IN_HEADER | ||
extern Wrapper ew; | ||
bool stuff(int p) | ||
{ | ||
return ew.indexIt(p); | ||
} | ||
#endif | ||
|
||
// CHECK-NOT: call {{.*}} @_ZN13TmplWithArrayIbLi10EEixEi | ||
// CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EE5func1Ei | ||
// CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EE5func2Ei | ||
|