xref: /llvm-project/llvm/test/Transforms/NewGVN/assume-equal-xfail.ll (revision fa8448c1b18bfe7ffa89f91ab0cfc16f2f83760d)
1; XFAIL: *
2; RUN: opt < %s -passes=newgvn -S | FileCheck %s
3
4%struct.A = type { ptr }
5@_ZTV1A = available_externally unnamed_addr constant [4 x ptr] [ptr null, ptr @_ZTI1A, ptr @_ZN1A3fooEv, ptr @_ZN1A3barEv], align 8
6@_ZTI1A = external constant ptr
7
8; Checks if indirect calls can be replaced with direct
9; assuming that %vtable == @_ZTV1A (with alignment).
10; Checking const propagation across other BBs
11; CHECK-LABEL: define void @_Z1gb(
12
13define void @_Z1gb(i1 zeroext %p) {
14entry:
15  %call = tail call noalias ptr @_Znwm(i64 8) #4
16  tail call void @_ZN1AC1Ev(ptr %call) #1
17  %vtable = load ptr, ptr %call, align 8
18  %cmp.vtables = icmp eq ptr %vtable, getelementptr inbounds ([4 x ptr], ptr @_ZTV1A, i64 0, i64 2)
19  tail call void @llvm.assume(i1 %cmp.vtables)
20  br i1 %p, label %if.then, label %if.else
21
22if.then:                                          ; preds = %entry
23  %0 = load ptr, ptr %vtable, align 8
24
25  ; CHECK: call i32 @_ZN1A3fooEv(
26  %call2 = tail call i32 %0(ptr %call) #1
27
28  br label %if.end
29
30if.else:                                          ; preds = %entry
31  %vfn47 = getelementptr inbounds ptr, ptr %vtable, i64 1
32
33  ; CHECK: call i32 @_ZN1A3barEv(
34  %1 = load ptr, ptr %vfn47, align 8
35
36  %call5 = tail call i32 %1(ptr %call) #1
37  br label %if.end
38
39if.end:                                           ; preds = %if.else, %if.then
40  ret void
41}
42
43; Check integration with invariant.group handling
44; CHECK-LABEL: define void @invariantGroupHandling(i1 zeroext %p) {
45define void @invariantGroupHandling(i1 zeroext %p) {
46entry:
47  %call = tail call noalias ptr @_Znwm(i64 8) #4
48  tail call void @_ZN1AC1Ev(ptr %call) #1
49  %vtable = load ptr, ptr %call, align 8, !invariant.group !0
50  %cmp.vtables = icmp eq ptr %vtable, getelementptr inbounds ([4 x ptr], ptr @_ZTV1A, i64 0, i64 2)
51  tail call void @llvm.assume(i1 %cmp.vtables)
52  br i1 %p, label %if.then, label %if.else
53
54if.then:                                          ; preds = %entry
55  %0 = load ptr, ptr %vtable, align 8
56
57; CHECK: call i32 @_ZN1A3fooEv(
58  %call2 = tail call i32 %0(ptr %call) #1
59  %vtable1 = load ptr, ptr %call, align 8, !invariant.group !0
60  %call1 = load ptr, ptr %vtable1, align 8
61; CHECK: call i32 @_ZN1A3fooEv(
62  %callx = tail call i32 %call1(ptr %call) #1
63
64  %vtable2 = load ptr, ptr %call, align 8, !invariant.group !0
65  %call4 = load ptr, ptr %vtable2, align 8
66; CHECK: call i32 @_ZN1A3fooEv(
67  %cally = tail call i32 %call4(ptr %call) #1
68
69  %vtable3 = load ptr, ptr %call, align 8, !invariant.group !0
70  %vfun = load ptr, ptr %vtable3, align 8
71; CHECK: call i32 @_ZN1A3fooEv(
72  %unknown = tail call i32 %vfun(ptr %call) #1
73
74  br label %if.end
75
76if.else:                                          ; preds = %entry
77  %vfn47 = getelementptr inbounds ptr, ptr %vtable, i64 1
78
79  ; CHECK: call i32 @_ZN1A3barEv(
80  %1 = load ptr, ptr %vfn47, align 8
81
82  %call5 = tail call i32 %1(ptr %call) #1
83  br label %if.end
84
85if.end:                                           ; preds = %if.else, %if.then
86  ret void
87}
88
89
90; Checking const propagation in the same BB
91; CHECK-LABEL: define i32 @main()
92
93define i32 @main() {
94entry:
95  %call = tail call noalias ptr @_Znwm(i64 8)
96  tail call void @_ZN1AC1Ev(ptr %call)
97  %vtable = load ptr, ptr %call, align 8
98  %cmp.vtables = icmp eq ptr %vtable, getelementptr inbounds ([4 x ptr], ptr @_ZTV1A, i64 0, i64 2)
99  tail call void @llvm.assume(i1 %cmp.vtables)
100
101  ; CHECK: call i32 @_ZN1A3fooEv(
102  %0 = load ptr, ptr %vtable, align 8
103
104  %call2 = tail call i32 %0(ptr %call)
105  ret i32 0
106}
107
108; This tests checks const propatation with fcmp instruction.
109; CHECK-LABEL: define float @_Z1gf(float %p)
110
111define float @_Z1gf(float %p) {
112entry:
113  %p.addr = alloca float, align 4
114  %f = alloca float, align 4
115  store float %p, ptr %p.addr, align 4
116
117  store float 3.000000e+00, ptr %f, align 4
118  %0 = load float, ptr %p.addr, align 4
119  %1 = load float, ptr %f, align 4
120  %cmp = fcmp oeq float %1, %0 ; note const on lhs
121  call void @llvm.assume(i1 %cmp)
122
123  ; CHECK: ret float 3.000000e+00
124  ret float %0
125}
126
127; CHECK-LABEL: define float @_Z1hf(float %p)
128
129define float @_Z1hf(float %p) {
130entry:
131  %p.addr = alloca float, align 4
132  store float %p, ptr %p.addr, align 4
133
134  %0 = load float, ptr %p.addr, align 4
135  %cmp = fcmp nnan ueq float %0, 3.000000e+00
136  call void @llvm.assume(i1 %cmp)
137
138  ; CHECK: ret float 3.000000e+00
139  ret float %0
140}
141
142declare noalias ptr @_Znwm(i64)
143declare void @_ZN1AC1Ev(ptr)
144declare void @llvm.assume(i1)
145declare i32 @_ZN1A3fooEv(ptr)
146declare i32 @_ZN1A3barEv(ptr)
147
148!0 = !{!"struct A"}
149