149 lines · plain
1; XFAIL: *2; RUN: opt < %s -passes=newgvn -S | FileCheck %s3 4%struct.A = type { ptr }5@_ZTV1A = available_externally unnamed_addr constant [4 x ptr] [ptr null, ptr @_ZTI1A, ptr @_ZN1A3fooEv, ptr @_ZN1A3barEv], align 86@_ZTI1A = external constant ptr7 8; Checks if indirect calls can be replaced with direct9; assuming that %vtable == @_ZTV1A (with alignment).10; Checking const propagation across other BBs11; CHECK-LABEL: define void @_Z1gb(12 13define void @_Z1gb(i1 zeroext %p) {14entry:15 %call = tail call noalias ptr @_Znwm(i64 8) #416 tail call void @_ZN1AC1Ev(ptr %call) #117 %vtable = load ptr, ptr %call, align 818 %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.else21 22if.then: ; preds = %entry23 %0 = load ptr, ptr %vtable, align 824 25 ; CHECK: call i32 @_ZN1A3fooEv(26 %call2 = tail call i32 %0(ptr %call) #127 28 br label %if.end29 30if.else: ; preds = %entry31 %vfn47 = getelementptr inbounds ptr, ptr %vtable, i64 132 33 ; CHECK: call i32 @_ZN1A3barEv(34 %1 = load ptr, ptr %vfn47, align 835 36 %call5 = tail call i32 %1(ptr %call) #137 br label %if.end38 39if.end: ; preds = %if.else, %if.then40 ret void41}42 43; Check integration with invariant.group handling44; CHECK-LABEL: define void @invariantGroupHandling(i1 zeroext %p) {45define void @invariantGroupHandling(i1 zeroext %p) {46entry:47 %call = tail call noalias ptr @_Znwm(i64 8) #448 tail call void @_ZN1AC1Ev(ptr %call) #149 %vtable = load ptr, ptr %call, align 8, !invariant.group !050 %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.else53 54if.then: ; preds = %entry55 %0 = load ptr, ptr %vtable, align 856 57; CHECK: call i32 @_ZN1A3fooEv(58 %call2 = tail call i32 %0(ptr %call) #159 %vtable1 = load ptr, ptr %call, align 8, !invariant.group !060 %call1 = load ptr, ptr %vtable1, align 861; CHECK: call i32 @_ZN1A3fooEv(62 %callx = tail call i32 %call1(ptr %call) #163 64 %vtable2 = load ptr, ptr %call, align 8, !invariant.group !065 %call4 = load ptr, ptr %vtable2, align 866; CHECK: call i32 @_ZN1A3fooEv(67 %cally = tail call i32 %call4(ptr %call) #168 69 %vtable3 = load ptr, ptr %call, align 8, !invariant.group !070 %vfun = load ptr, ptr %vtable3, align 871; CHECK: call i32 @_ZN1A3fooEv(72 %unknown = tail call i32 %vfun(ptr %call) #173 74 br label %if.end75 76if.else: ; preds = %entry77 %vfn47 = getelementptr inbounds ptr, ptr %vtable, i64 178 79 ; CHECK: call i32 @_ZN1A3barEv(80 %1 = load ptr, ptr %vfn47, align 881 82 %call5 = tail call i32 %1(ptr %call) #183 br label %if.end84 85if.end: ; preds = %if.else, %if.then86 ret void87}88 89 90; Checking const propagation in the same BB91; 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 898 %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 8103 104 %call2 = tail call i32 %0(ptr %call)105 ret i32 0106}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 4114 %f = alloca float, align 4115 store float %p, ptr %p.addr, align 4116 117 store float 3.000000e+00, ptr %f, align 4118 %0 = load float, ptr %p.addr, align 4119 %1 = load float, ptr %f, align 4120 %cmp = fcmp oeq float %1, %0 ; note const on lhs121 call void @llvm.assume(i1 %cmp)122 123 ; CHECK: ret float 3.000000e+00124 ret float %0125}126 127; CHECK-LABEL: define float @_Z1hf(float %p)128 129define float @_Z1hf(float %p) {130entry:131 %p.addr = alloca float, align 4132 store float %p, ptr %p.addr, align 4133 134 %0 = load float, ptr %p.addr, align 4135 %cmp = fcmp nnan ueq float %0, 3.000000e+00136 call void @llvm.assume(i1 %cmp)137 138 ; CHECK: ret float 3.000000e+00139 ret float %0140}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