Skip to content

Conversation

@hassnaaHamdi
Copy link
Member

@hassnaaHamdi hassnaaHamdi commented Nov 2, 2025

Don't drop assume intrinsic when it's using public_type_test intrinsic,
as it could be used by devirtualization.

@llvmbot
Copy link
Member

llvmbot commented Nov 2, 2025

@llvm/pr-subscribers-llvm-transforms

Author: Hassnaa Hamdi (hassnaaHamdi)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/166034.diff

2 Files Affected:

  • (modified) llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp (+2-1)
  • (modified) llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll (+12)
diff --git a/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp b/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp
index 89980d54ee897..a577f517d1e89 100644
--- a/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp
+++ b/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp
@@ -122,7 +122,8 @@ DropUnnecessaryAssumesPass::run(Function &F, FunctionAnalysisManager &FAM) {
 
     Value *Cond = Assume->getArgOperand(0);
     // Don't drop type tests, which have special semantics.
-    if (match(Cond, m_Intrinsic<Intrinsic::type_test>()))
+    if (match(Cond, m_Intrinsic<Intrinsic::type_test>()) ||
+        match(Cond, m_Intrinsic<Intrinsic::public_type_test>()))
       continue;
 
     SmallVector<Value *> Affected;
diff --git a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll
index 8a6f60ba7a204..87aed77d06ef8 100644
--- a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll
+++ b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll
@@ -184,6 +184,18 @@ define void @type_test(ptr %x) {
   ret void
 }
 
+define void @public_type_test(ptr %x) {
+; CHECK-LABEL: define void @public_type_test(
+; CHECK-SAME: ptr [[X:%.*]]) {
+; CHECK-NEXT:    [[TEST:%.*]] = call i1 @llvm.public.type.test(ptr [[X]], metadata !"typeid")
+; CHECK-NEXT:    call void @llvm.assume(i1 [[TEST]])
+; CHECK-NEXT:    ret void
+;
+  %test = call i1 @llvm.public.type.test(ptr %x, metadata !"typeid")
+  call void @llvm.assume(i1 %test)
+  ret void
+}
+
 define void @multiple_dead_conds(i32 %x) {
 ; CHECK-LABEL: define void @multiple_dead_conds(
 ; CHECK-SAME: i32 [[X:%.*]]) {

@hassnaaHamdi
Copy link
Member Author

@nikic Doesn't the name of 'basic.ll' file seem a bit weird? :'D

Copy link
Member

@dtcxzyw dtcxzyw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@dtcxzyw
Copy link
Member

dtcxzyw commented Nov 2, 2025

Doesn't the name of 'basic.ll' file seem a bit weird? :'D

It is fine for a newly added pass :)

./llvm-project/llvm/test/Transforms/LowerGuardIntrinsic/basic.ll
./llvm-project/llvm/test/Transforms/LoopInstSimplify/basic.ll
./llvm-project/llvm/test/Transforms/UnifyLoopExits/basic.ll
./llvm-project/llvm/test/Transforms/JumpThreading/basic.ll
./llvm-project/llvm/test/Transforms/Util/DeclareRuntimeLibcalls/basic.ll
./llvm-project/llvm/test/Transforms/StripDeadPrototypes/basic.ll
./llvm-project/llvm/test/Transforms/SimplifyTypeTests/basic.ll
./llvm-project/llvm/test/Transforms/RewriteStatepointsForGC/basic.ll
./llvm-project/llvm/test/Transforms/GuardWidening/basic.ll
./llvm-project/llvm/test/Transforms/PhaseOrdering/basic.ll
./llvm-project/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll
./llvm-project/llvm/test/Transforms/CrossDSOCFI/basic.ll
./llvm-project/llvm/test/Transforms/LowerWidenableCondition/basic.ll
./llvm-project/llvm/test/Transforms/GVN/basic.ll
./llvm-project/llvm/test/Transforms/BDCE/basic.ll
./llvm-project/llvm/test/Transforms/AddDiscriminators/basic.ll
./llvm-project/llvm/test/Transforms/FixIrreducible/basic.ll
./llvm-project/llvm/test/Transforms/LoopRotate/basic.ll
./llvm-project/llvm/test/Transforms/LoopIdiom/basic.ll
./llvm-project/llvm/test/Transforms/PlaceSafepoints/basic.ll
./llvm-project/llvm/test/Transforms/EarlyCSE/basic.ll
./llvm-project/llvm/test/Transforms/TailCallElim/basic.ll
./llvm-project/llvm/test/Transforms/InferAddressSpaces/AMDGPU/basic.ll
./llvm-project/llvm/test/Transforms/GlobalSplit/basic.ll
./llvm-project/llvm/test/Transforms/Sink/basic.ll
./llvm-project/llvm/test/Transforms/LoopVersioning/basic.ll
./llvm-project/llvm/test/Transforms/GlobalMerge/basic.ll
./llvm-project/llvm/test/Transforms/InstNamer/basic.ll
./llvm-project/llvm/test/Transforms/LoopDataPrefetch/LoongArch/basic.ll
./llvm-project/llvm/test/Transforms/LoopDataPrefetch/RISCV/basic.ll
./llvm-project/llvm/test/Transforms/LoopDataPrefetch/PowerPC/basic.ll
./llvm-project/llvm/test/Transforms/Scalarizer/basic.ll
./llvm-project/llvm/test/Transforms/DCE/basic.ll
./llvm-project/llvm/test/Transforms/LowerExpectIntrinsic/basic.ll
./llvm-project/llvm/test/Transforms/MemProfContextDisambiguation/basic.ll
./llvm-project/llvm/test/Transforms/LoopPredication/basic.ll
./llvm-project/llvm/test/Transforms/LoopUnroll/basic.ll
./llvm-project/llvm/test/Transforms/IndirectBrExpand/basic.ll
./llvm-project/llvm/test/Transforms/LoopDistribute/basic.ll
./llvm-project/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
./llvm-project/llvm/test/Transforms/NewGVN/basic.ll
./llvm-project/llvm/test/Transforms/JumpTableToSwitch/basic.ll
./llvm-project/llvm/test/Transforms/Float2Int/basic.ll
./llvm-project/llvm/test/Transforms/ObjCARC/basic.ll
./llvm-project/llvm/test/Transforms/MakeGuardsExplicit/basic.ll

@hassnaaHamdi
Copy link
Member Author

@dtcxzyw Thanks for the clarification and the review :))

@antoniofrighetto antoniofrighetto changed the title [DropUnnecessaryAssumes]: don't drop public_type_test [DropUnnecessaryAssumes] Don't drop public_type_test intrinsic Nov 3, 2025
@hassnaaHamdi hassnaaHamdi merged commit 8998df2 into llvm:main Nov 3, 2025
12 checks passed
DEBADRIBASAK pushed a commit to DEBADRIBASAK/llvm-project that referenced this pull request Nov 3, 2025
…166034)

Don't drop `assume` intrinsic when it's using `public_type_test `
intrinsic, as it could be used by devirtualization.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants