[llvm] d6ecd6a - [SelectionDAG][X86] Handle `llvm.type.test` in DAGBuilder (#142939)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 8 22:14:59 PDT 2025
Author: Abhishek Kaushik
Date: 2025-06-09T10:44:55+05:30
New Revision: d6ecd6a658103adc76cf67de64e0b5b399e6fcef
URL: https://github.com/llvm/llvm-project/commit/d6ecd6a658103adc76cf67de64e0b5b399e6fcef
DIFF: https://github.com/llvm/llvm-project/commit/d6ecd6a658103adc76cf67de64e0b5b399e6fcef.diff
LOG: [SelectionDAG][X86] Handle `llvm.type.test` in DAGBuilder (#142939)
Closes #142937
Added:
llvm/test/CodeGen/X86/pr142937.ll
Modified:
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 2460c864b0815..e6a1dc930685c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7384,6 +7384,11 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
setValue(&I, getValue(I.getOperand(0)));
return;
+ case Intrinsic::type_test:
+ case Intrinsic::public_type_test:
+ setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
+ return;
+
case Intrinsic::assume:
case Intrinsic::experimental_noalias_scope_decl:
case Intrinsic::var_annotation:
diff --git a/llvm/test/CodeGen/X86/pr142937.ll b/llvm/test/CodeGen/X86/pr142937.ll
new file mode 100644
index 0000000000000..8be99e102ff5b
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr142937.ll
@@ -0,0 +1,64 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=i686-- -O0 | FileCheck %s --check-prefix=X86
+; RUN: llc < %s -mtriple=x86_64-- -O0 | FileCheck %s --check-prefix=X64
+
+define void @public_type_test() {
+; X86-LABEL: public_type_test:
+; X86: # %bb.0: # %bb
+; X86-NEXT: movb $1, %al
+; X86-NEXT: # %bb.1: # %bb1
+; X86-NEXT: retl
+;
+; X64-LABEL: public_type_test:
+; X64: # %bb.0: # %bb
+; X64-NEXT: movb $1, %al
+; X64-NEXT: # %bb.1: # %bb1
+; X64-NEXT: retq
+bb:
+ %call = call i1 @llvm.public.type.test(ptr null, metadata !"typeinfo")
+ br label %bb1
+
+bb1:
+ call void @llvm.assume(i1 %call)
+ ret void
+}
+
+define void @type_test() {
+; X86-LABEL: type_test:
+; X86: # %bb.0: # %bb
+; X86-NEXT: movb $1, %al
+; X86-NEXT: testb $1, %al
+; X86-NEXT: jne .LBB1_2
+; X86-NEXT: # %bb.1: # %bb1
+; X86-NEXT: ud1l 2(%eax), %eax
+; X86-NEXT: .LBB1_2: # %bb2
+; X86-NEXT: retl
+;
+; X64-LABEL: type_test:
+; X64: # %bb.0: # %bb
+; X64-NEXT: movb $1, %al
+; X64-NEXT: testb $1, %al
+; X64-NEXT: jne .LBB1_2
+; X64-NEXT: # %bb.1: # %bb1
+; X64-NEXT: ud1l 2(%eax), %eax
+; X64-NEXT: .LBB1_2: # %bb2
+; X64-NEXT: retq
+bb:
+ %call = tail call i1 @llvm.type.test(ptr null, metadata !"typeinfo")
+ br i1 %call, label %bb2, label %bb1
+
+bb1:
+ tail call void @llvm.ubsantrap(i8 2)
+ unreachable
+
+bb2:
+ ret void
+}
+
+declare i1 @llvm.public.type.test(ptr, metadata)
+
+declare void @llvm.assume(i1 noundef)
+
+declare i1 @llvm.type.test(ptr, metadata)
+
+declare void @llvm.ubsantrap(i8 immarg)
More information about the llvm-commits
mailing list