Skip to content

Commit d6ecd6a

Browse files
[SelectionDAG][X86] Handle llvm.type.test in DAGBuilder (#142939)
Closes #142937
1 parent 392bd57 commit d6ecd6a

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7384,6 +7384,11 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
73847384
setValue(&I, getValue(I.getOperand(0)));
73857385
return;
73867386

7387+
case Intrinsic::type_test:
7388+
case Intrinsic::public_type_test:
7389+
setValue(&I, getValue(ConstantInt::getTrue(I.getType())));
7390+
return;
7391+
73877392
case Intrinsic::assume:
73887393
case Intrinsic::experimental_noalias_scope_decl:
73897394
case Intrinsic::var_annotation:

llvm/test/CodeGen/X86/pr142937.ll

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=i686-- -O0 | FileCheck %s --check-prefix=X86
3+
; RUN: llc < %s -mtriple=x86_64-- -O0 | FileCheck %s --check-prefix=X64
4+
5+
define void @public_type_test() {
6+
; X86-LABEL: public_type_test:
7+
; X86: # %bb.0: # %bb
8+
; X86-NEXT: movb $1, %al
9+
; X86-NEXT: # %bb.1: # %bb1
10+
; X86-NEXT: retl
11+
;
12+
; X64-LABEL: public_type_test:
13+
; X64: # %bb.0: # %bb
14+
; X64-NEXT: movb $1, %al
15+
; X64-NEXT: # %bb.1: # %bb1
16+
; X64-NEXT: retq
17+
bb:
18+
%call = call i1 @llvm.public.type.test(ptr null, metadata !"typeinfo")
19+
br label %bb1
20+
21+
bb1:
22+
call void @llvm.assume(i1 %call)
23+
ret void
24+
}
25+
26+
define void @type_test() {
27+
; X86-LABEL: type_test:
28+
; X86: # %bb.0: # %bb
29+
; X86-NEXT: movb $1, %al
30+
; X86-NEXT: testb $1, %al
31+
; X86-NEXT: jne .LBB1_2
32+
; X86-NEXT: # %bb.1: # %bb1
33+
; X86-NEXT: ud1l 2(%eax), %eax
34+
; X86-NEXT: .LBB1_2: # %bb2
35+
; X86-NEXT: retl
36+
;
37+
; X64-LABEL: type_test:
38+
; X64: # %bb.0: # %bb
39+
; X64-NEXT: movb $1, %al
40+
; X64-NEXT: testb $1, %al
41+
; X64-NEXT: jne .LBB1_2
42+
; X64-NEXT: # %bb.1: # %bb1
43+
; X64-NEXT: ud1l 2(%eax), %eax
44+
; X64-NEXT: .LBB1_2: # %bb2
45+
; X64-NEXT: retq
46+
bb:
47+
%call = tail call i1 @llvm.type.test(ptr null, metadata !"typeinfo")
48+
br i1 %call, label %bb2, label %bb1
49+
50+
bb1:
51+
tail call void @llvm.ubsantrap(i8 2)
52+
unreachable
53+
54+
bb2:
55+
ret void
56+
}
57+
58+
declare i1 @llvm.public.type.test(ptr, metadata)
59+
60+
declare void @llvm.assume(i1 noundef)
61+
62+
declare i1 @llvm.type.test(ptr, metadata)
63+
64+
declare void @llvm.ubsantrap(i8 immarg)

0 commit comments

Comments
 (0)