Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit bb516bc

Browse files
committed
WholeProgramDevirt: Create bitcast to i8* at each virtual call site.
We can't reuse the llvm.assume instruction's bitcast because it may not dominate every user of the vtable pointer. Differential Revision: https://reviews.llvm.org/D36994 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311491 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 6008ca2 commit bb516bc

File tree

6 files changed

+51
-5
lines changed

6 files changed

+51
-5
lines changed

lib/Transforms/IPO/WholeProgramDevirt.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -876,8 +876,9 @@ void DevirtModule::applyUniqueRetValOpt(CallSiteInfo &CSInfo, StringRef FnName,
876876
Constant *UniqueMemberAddr) {
877877
for (auto &&Call : CSInfo.CallSites) {
878878
IRBuilder<> B(Call.CS.getInstruction());
879-
Value *Cmp = B.CreateICmp(IsOne ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE,
880-
Call.VTable, UniqueMemberAddr);
879+
Value *Cmp =
880+
B.CreateICmp(IsOne ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE,
881+
B.CreateBitCast(Call.VTable, Int8PtrTy), UniqueMemberAddr);
881882
Cmp = B.CreateZExt(Cmp, Call.CS->getType());
882883
Call.replaceAndErase("unique-ret-val", FnName, RemarksEnabled, OREGetter,
883884
Cmp);
@@ -943,7 +944,8 @@ void DevirtModule::applyVirtualConstProp(CallSiteInfo &CSInfo, StringRef FnName,
943944
for (auto Call : CSInfo.CallSites) {
944945
auto *RetType = cast<IntegerType>(Call.CS.getType());
945946
IRBuilder<> B(Call.CS.getInstruction());
946-
Value *Addr = B.CreateGEP(Int8Ty, Call.VTable, Byte);
947+
Value *Addr =
948+
B.CreateGEP(Int8Ty, B.CreateBitCast(Call.VTable, Int8PtrTy), Byte);
947949
if (RetType->getBitWidth() == 1) {
948950
Value *Bits = B.CreateLoad(Addr);
949951
Value *BitsAndBit = B.CreateAnd(Bits, Bit);
@@ -1147,8 +1149,7 @@ void DevirtModule::scanTypeTestUsers(Function *TypeTestFunc,
11471149
Value *Ptr = CI->getArgOperand(0)->stripPointerCasts();
11481150
if (SeenPtrs.insert(Ptr).second) {
11491151
for (DevirtCallSite Call : DevirtCalls) {
1150-
CallSlots[{TypeId, Call.Offset}].addCallSite(CI->getArgOperand(0),
1151-
Call.CS, nullptr);
1152+
CallSlots[{TypeId, Call.Offset}].addCallSite(Ptr, Call.CS, nullptr);
11521153
}
11531154
}
11541155
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
; RUN: opt -S -wholeprogramdevirt -wholeprogramdevirt-summary-action=import -wholeprogramdevirt-read-summary=%S/Inputs/import-vcp.yaml < %s | FileCheck %s
2+
3+
target datalayout = "e-p:64:64"
4+
target triple = "x86_64-unknown-linux-gnu"
5+
6+
define i32 @call1(i1 %a, i8* %obj) {
7+
%vtableptr = bitcast i8* %obj to [3 x i8*]**
8+
%vtable = load [3 x i8*]*, [3 x i8*]** %vtableptr
9+
br i1 %a, label %bb1, label %bb2
10+
11+
bb1:
12+
; CHECK: {{.*}} = bitcast {{.*}} to i8*
13+
%vtablei8_1 = bitcast [3 x i8*]* %vtable to i8*
14+
%p1 = call i1 @llvm.type.test(i8* %vtablei8_1, metadata !"typeid1")
15+
call void @llvm.assume(i1 %p1)
16+
%fptrptr1 = getelementptr [3 x i8*], [3 x i8*]* %vtable, i32 0, i32 0
17+
%fptr1 = load i8*, i8** %fptrptr1
18+
%fptr1_casted = bitcast i8* %fptr1 to i32 (i8*, i32)*
19+
; CHECK: {{.*}} = bitcast {{.*}} to i8*
20+
%result1 = call i32 %fptr1_casted(i8* %obj, i32 1)
21+
br label %bb2
22+
23+
; CHECK: :
24+
bb2:
25+
%vtablei8_2 = bitcast [3 x i8*]* %vtable to i8*
26+
%p = call i1 @llvm.type.test(i8* %vtablei8_2, metadata !"typeid1")
27+
call void @llvm.assume(i1 %p)
28+
%fptrptr2 = getelementptr [3 x i8*], [3 x i8*]* %vtable, i32 0, i32 0
29+
%fptr2 = load i8*, i8** %fptrptr2
30+
%fptr2_casted = bitcast i8* %fptr2 to i32 (i8*, i32)*
31+
; CHECK: {{.*}} = bitcast {{.*}} to i8*
32+
%result2 = call i32 %fptr2_casted(i8* %obj, i32 1)
33+
ret i32 %result2
34+
}
35+
36+
declare void @llvm.assume(i1)
37+
declare i1 @llvm.type.test(i8*, metadata)

test/Transforms/WholeProgramDevirt/import.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ define i32 @call1(i8* %obj) {
2929
; SINGLE-IMPL: call i32 bitcast (void ()* @singleimpl1 to i32 (i8*, i32)*)
3030
%result = call i32 %fptr_casted(i8* %obj, i32 1)
3131
; UNIFORM-RET-VAL: ret i32 42
32+
; VCP: {{.*}} = bitcast {{.*}} to i8*
3233
; VCP: [[VT1:%.*]] = bitcast {{.*}} to i8*
3334
; VCP: [[GEP1:%.*]] = getelementptr i8, i8* [[VT1]], i32 ptrtoint (i8* @__typeid_typeid1_0_1_byte to i32)
3435
; VCP: [[BC1:%.*]] = bitcast i8* [[GEP1]] to i32*

test/Transforms/WholeProgramDevirt/unique-retval.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ define i1 @vf1(i8* %this) readnone {
2020
define i1 @call1(i8* %obj) {
2121
%vtableptr = bitcast i8* %obj to [1 x i8*]**
2222
%vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr
23+
; CHECK: {{.*}} = bitcast [1 x i8*]* {{.*}} to i8*
2324
; CHECK: [[VT1:%[^ ]*]] = bitcast [1 x i8*]* {{.*}} to i8*
2425
%vtablei8 = bitcast [1 x i8*]* %vtable to i8*
2526
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid1")

test/Transforms/WholeProgramDevirt/virtual-const-prop-begin.ll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ define i32 @vf4i32(i8* %this) readnone {
7171
define i1 @call1(i8* %obj) {
7272
%vtableptr = bitcast i8* %obj to [3 x i8*]**
7373
%vtable = load [3 x i8*]*, [3 x i8*]** %vtableptr
74+
; CHECK: {{.*}} = bitcast [3 x i8*]* {{.*}} to i8*
7475
; CHECK: [[VT1:%[^ ]*]] = bitcast [3 x i8*]* {{.*}} to i8*
7576
%vtablei8 = bitcast [3 x i8*]* %vtable to i8*
7677
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid")
@@ -91,6 +92,7 @@ define i1 @call1(i8* %obj) {
9192
define i1 @call2(i8* %obj) {
9293
%vtableptr = bitcast i8* %obj to [3 x i8*]**
9394
%vtable = load [3 x i8*]*, [3 x i8*]** %vtableptr
95+
; CHECK: {{.*}} = bitcast [3 x i8*]* {{.*}} to i8*
9496
; CHECK: [[VT2:%[^ ]*]] = bitcast [3 x i8*]* {{.*}} to i8*
9597
%vtablei8 = bitcast [3 x i8*]* %vtable to i8*
9698
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid")
@@ -111,6 +113,7 @@ define i1 @call2(i8* %obj) {
111113
define i32 @call3(i8* %obj) {
112114
%vtableptr = bitcast i8* %obj to [3 x i8*]**
113115
%vtable = load [3 x i8*]*, [3 x i8*]** %vtableptr
116+
; CHECK: {{.*}} = bitcast [3 x i8*]* {{.*}} to i8*
114117
; CHECK: [[VT3:%[^ ]*]] = bitcast [3 x i8*]* {{.*}} to i8*
115118
%vtablei8 = bitcast [3 x i8*]* %vtable to i8*
116119
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid")

test/Transforms/WholeProgramDevirt/virtual-const-prop-end.ll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ define i32 @vf4i32(i8* %this) readnone {
6666
define i1 @call1(i8* %obj) {
6767
%vtableptr = bitcast i8* %obj to [3 x i8*]**
6868
%vtable = load [3 x i8*]*, [3 x i8*]** %vtableptr
69+
; CHECK: {{.*}} = bitcast [3 x i8*]* {{.*}} to i8*
6970
; CHECK: [[VT1:%[^ ]*]] = bitcast [3 x i8*]* {{.*}} to i8*
7071
%vtablei8 = bitcast [3 x i8*]* %vtable to i8*
7172
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid")
@@ -86,6 +87,7 @@ define i1 @call1(i8* %obj) {
8687
define i1 @call2(i8* %obj) {
8788
%vtableptr = bitcast i8* %obj to [3 x i8*]**
8889
%vtable = load [3 x i8*]*, [3 x i8*]** %vtableptr
90+
; CHECK: {{.*}} = bitcast [3 x i8*]* {{.*}} to i8*
8991
; CHECK: [[VT2:%[^ ]*]] = bitcast [3 x i8*]* {{.*}} to i8*
9092
%vtablei8 = bitcast [3 x i8*]* %vtable to i8*
9193
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid")
@@ -106,6 +108,7 @@ define i1 @call2(i8* %obj) {
106108
define i32 @call3(i8* %obj) {
107109
%vtableptr = bitcast i8* %obj to [3 x i8*]**
108110
%vtable = load [3 x i8*]*, [3 x i8*]** %vtableptr
111+
; CHECK: {{.*}} = bitcast [3 x i8*]* {{.*}} to i8*
109112
; CHECK: [[VT3:%[^ ]*]] = bitcast [3 x i8*]* {{.*}} to i8*
110113
%vtablei8 = bitcast [3 x i8*]* %vtable to i8*
111114
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid")

0 commit comments

Comments
 (0)