mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
54e8749794
This pass implements whole program optimization of virtual calls in cases where we know (via bitset information) that the list of callees is fixed. This includes the following: - Single implementation devirtualization: if a virtual call has a single possible callee, replace all calls with a direct call to that callee. - Virtual constant propagation: if the virtual function's return type is an integer <=64 bits and all possible callees are readnone, for each class and each list of constant arguments: evaluate the function, store the return value alongside the virtual table, and rewrite each virtual call as a load from the virtual table. - Uniform return value optimization: if the conditions for virtual constant propagation hold and each function returns the same constant value, replace each virtual call with that constant. - Unique return value optimization for i1 return values: if the conditions for virtual constant propagation hold and a single vtable's function returns 0, or a single vtable's function returns 1, replace each virtual call with a comparison of the vptr against that vtable's address. Differential Revision: http://reviews.llvm.org/D16795 llvm-svn: 260312
26 lines
725 B
LLVM
26 lines
725 B
LLVM
; RUN: llvm-as %s -o %t.o
|
|
; REQUIRES: asserts
|
|
|
|
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
|
|
; RUN: --plugin-opt=disable-verify \
|
|
; RUN: --plugin-opt=-debug-pass=Arguments \
|
|
; RUN: -shared %t.o -o %t2.o 2>&1 | FileCheck %s
|
|
|
|
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
|
|
; RUN: --plugin-opt=-debug-pass=Arguments \
|
|
; RUN: -shared %t.o -o %t2.o 2>&1 | FileCheck %s -check-prefix=VERIFY
|
|
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
; -disable-verify should disable output verification from the optimization
|
|
; pipeline.
|
|
; CHECK: Pass Arguments: {{.*}} -verify -
|
|
; CHECK-NOT: -verify
|
|
|
|
; VERIFY: Pass Arguments: {{.*}} -verify {{.*}} -verify
|
|
|
|
define void @f() {
|
|
entry:
|
|
ret void
|
|
}
|