From bf38a6cacfddbc73de79d13aacb5b7e3bead4fc0 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Tue, 12 Jul 2016 02:38:37 +0000 Subject: [PATCH] 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275145 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/WholeProgramDevirt.cpp | 10 ++++++++++ test/Transforms/WholeProgramDevirt/devirt-single-impl-check.ll | 5 ++++- test/Transforms/WholeProgramDevirt/non-constant-vtable.ll | 4 +++- test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll | 7 ++++++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/IPO/WholeProgramDevirt.cpp b/lib/Transforms/IPO/WholeProgramDevirt.cpp index e6f4fa29224..53eb4e2c907 100644 --- a/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -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(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. diff --git a/test/Transforms/WholeProgramDevirt/devirt-single-impl-check.ll b/test/Transforms/WholeProgramDevirt/devirt-single-impl-check.ll index 7c52f26ebea..e5e64ab05a2 100644 --- a/test/Transforms/WholeProgramDevirt/devirt-single-impl-check.ll +++ b/test/Transforms/WholeProgramDevirt/devirt-single-impl-check.ll @@ -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: :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 diff --git a/test/Transforms/WholeProgramDevirt/non-constant-vtable.ll b/test/Transforms/WholeProgramDevirt/non-constant-vtable.ll index f66409093c4..ecc8ad0e7c7 100644 --- a/test/Transforms/WholeProgramDevirt/non-constant-vtable.ll +++ b/test/Transforms/WholeProgramDevirt/non-constant-vtable.ll @@ -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" diff --git a/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll b/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll index 4e219e238e5..d2eff163a84 100644 --- a/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll +++ b/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll @@ -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: :0:0: devirtualized call +; CHECK: remark: :0:0: devirtualized call +; CHECK: remark: :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*), -- 2.11.0