Skip to content

Commit 8998df2

Browse files
authored
[DropUnnecessaryAssumes] Don't drop public_type_test intrinsic (#166034)
Don't drop `assume` intrinsic when it's using `public_type_test ` intrinsic, as it could be used by devirtualization.
1 parent 4c3546f commit 8998df2

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ DropUnnecessaryAssumesPass::run(Function &F, FunctionAnalysisManager &FAM) {
122122

123123
Value *Cond = Assume->getArgOperand(0);
124124
// Don't drop type tests, which have special semantics.
125-
if (match(Cond, m_Intrinsic<Intrinsic::type_test>()))
125+
if (match(Cond, m_Intrinsic<Intrinsic::type_test>()) ||
126+
match(Cond, m_Intrinsic<Intrinsic::public_type_test>()))
126127
continue;
127128

128129
SmallVector<Value *> Affected;

llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,18 @@ define void @type_test(ptr %x) {
184184
ret void
185185
}
186186

187+
define void @public_type_test(ptr %x) {
188+
; CHECK-LABEL: define void @public_type_test(
189+
; CHECK-SAME: ptr [[X:%.*]]) {
190+
; CHECK-NEXT: [[TEST:%.*]] = call i1 @llvm.public.type.test(ptr [[X]], metadata !"typeid")
191+
; CHECK-NEXT: call void @llvm.assume(i1 [[TEST]])
192+
; CHECK-NEXT: ret void
193+
;
194+
%test = call i1 @llvm.public.type.test(ptr %x, metadata !"typeid")
195+
call void @llvm.assume(i1 %test)
196+
ret void
197+
}
198+
187199
define void @multiple_dead_conds(i32 %x) {
188200
; CHECK-LABEL: define void @multiple_dead_conds(
189201
; CHECK-SAME: i32 [[X:%.*]]) {

0 commit comments

Comments
 (0)