[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / Transforms / NewGVN / assume-equal-xfail.ll
blob972a9bc0ae3ab8e699853b1328a2bb1b7731edfd
1 ; XFAIL: *
2 ; RUN: opt < %s -passes=newgvn -S | FileCheck %s
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
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(
13 define void @_Z1gb(i1 zeroext %p) {
14 entry:
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
22 if.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
30 if.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
39 if.end:                                           ; preds = %if.else, %if.then
40   ret void
43 ; Check integration with invariant.group handling
44 ; CHECK-LABEL: define void @invariantGroupHandling(i1 zeroext %p) {
45 define void @invariantGroupHandling(i1 zeroext %p) {
46 entry:
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
54 if.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
76 if.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
85 if.end:                                           ; preds = %if.else, %if.then
86   ret void
90 ; Checking const propagation in the same BB
91 ; CHECK-LABEL: define i32 @main()
93 define i32 @main() {
94 entry:
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
108 ; This tests checks const propatation with fcmp instruction.
109 ; CHECK-LABEL: define float @_Z1gf(float %p)
111 define float @_Z1gf(float %p) {
112 entry:
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
127 ; CHECK-LABEL: define float @_Z1hf(float %p)
129 define float @_Z1hf(float %p) {
130 entry:
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
142 declare noalias ptr @_Znwm(i64)
143 declare void @_ZN1AC1Ev(ptr)
144 declare void @llvm.assume(i1)
145 declare i32 @_ZN1A3fooEv(ptr)
146 declare i32 @_ZN1A3barEv(ptr)
148 !0 = !{!"struct A"}