mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Print remarks from WholeProgramDevirt pass for each call site.
Summary: It's useful to have some visibility about which call sites are devirtualized, especially for debug purposes. Another use case is a regression test on the application side (like, Chromium). Reviewers: pcc Differential Revision: http://reviews.llvm.org/D22252 llvm-svn: 275145
This commit is contained in:
parent
8288faf578
commit
28853a85a8
@ -35,6 +35,7 @@
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DiagnosticInfo.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
@ -215,7 +216,15 @@ struct VirtualCallSite {
|
||||
// of that field for details.
|
||||
unsigned *NumUnsafeUses;
|
||||
|
||||
void emitRemark() {
|
||||
Function *F = CS.getCaller();
|
||||
emitOptimizationRemark(F->getContext(), DEBUG_TYPE, *F,
|
||||
CS.getInstruction()->getDebugLoc(),
|
||||
"devirtualized call");
|
||||
}
|
||||
|
||||
void replaceAndErase(Value *New) {
|
||||
emitRemark();
|
||||
CS->replaceAllUsesWith(New);
|
||||
if (auto II = dyn_cast<InvokeInst>(CS.getInstruction())) {
|
||||
BranchInst::Create(II->getNormalDest(), CS.getInstruction());
|
||||
@ -394,6 +403,7 @@ bool DevirtModule::trySingleImplDevirt(
|
||||
|
||||
// If so, update each call site to call that implementation directly.
|
||||
for (auto &&VCallSite : CallSites) {
|
||||
VCallSite.emitRemark();
|
||||
VCallSite.CS.setCalledFunction(ConstantExpr::getBitCast(
|
||||
TheFn, VCallSite.CS.getCalledValue()->getType()));
|
||||
// This use is no longer unsafe.
|
||||
|
@ -1,8 +1,11 @@
|
||||
; RUN: opt -S -wholeprogramdevirt %s | FileCheck %s
|
||||
; RUN: opt -S -wholeprogramdevirt -pass-remarks=wholeprogramdevirt %s 2>&1 | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:64:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: remark: <unknown>:0:0: devirtualized call
|
||||
; CHECK-NOT: devirtualized call
|
||||
|
||||
@vt1 = constant [1 x i8*] [i8* bitcast (void (i8*)* @vf to i8*)], !type !0
|
||||
@vt2 = constant [1 x i8*] [i8* bitcast (void (i8*)* @vf to i8*)], !type !0
|
||||
|
||||
|
@ -1,4 +1,6 @@
|
||||
; RUN: opt -S -wholeprogramdevirt %s | FileCheck %s
|
||||
; RUN: opt -S -wholeprogramdevirt -pass-remarks=wholeprogramdevirt %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK-NOT: devirtualized call
|
||||
|
||||
target datalayout = "e-p:64:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
@ -1,8 +1,13 @@
|
||||
; RUN: opt -S -wholeprogramdevirt %s | FileCheck %s
|
||||
; RUN: opt -S -wholeprogramdevirt -pass-remarks=wholeprogramdevirt %s 2>&1 | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:64:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: remark: <unknown>:0:0: devirtualized call
|
||||
; CHECK: remark: <unknown>:0:0: devirtualized call
|
||||
; CHECK: remark: <unknown>:0:0: devirtualized call
|
||||
; CHECK-NOT: devirtualized call
|
||||
|
||||
; CHECK: [[VT1DATA:@[^ ]*]] = private constant { [8 x i8], [3 x i8*], [0 x i8] } { [8 x i8] c"\00\00\00\01\01\00\00\00", [3 x i8*] [i8* bitcast (i1 (i8*)* @vf0i1 to i8*), i8* bitcast (i1 (i8*)* @vf1i1 to i8*), i8* bitcast (i32 (i8*)* @vf1i32 to i8*)], [0 x i8] zeroinitializer }, section "vt1sec", !type [[T8:![0-9]+]]
|
||||
@vt1 = constant [3 x i8*] [
|
||||
i8* bitcast (i1 (i8*)* @vf0i1 to i8*),
|
||||
|
Loading…
Reference in New Issue
Block a user