From a1ecf16bfd69c32da86962c1a57a396d64bd4ac8 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Tue, 16 Aug 2011 01:17:17 +0000 Subject: [PATCH] Migrate this test from llvm/test/FrontendC++/ptr-to-method-devirt.cpp and FileCheckize. It is more properly an optimizer test. llvm-svn: 137700 --- test/Transforms/InstCombine/devirt.ll | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 test/Transforms/InstCombine/devirt.ll diff --git a/test/Transforms/InstCombine/devirt.ll b/test/Transforms/InstCombine/devirt.ll new file mode 100644 index 00000000000..6189dc2af4f --- /dev/null +++ b/test/Transforms/InstCombine/devirt.ll @@ -0,0 +1,39 @@ +; RUN: opt -instcombine -S -o - %s | FileCheck %s + +; CHECK-NOT: getelementptr +; CHECK-NOT: ptrtoint +; CHECK: bitcast i8* +%struct.S = type { i32 (...)** } + +@_ZL1p = internal constant { i64, i64 } { i64 1, i64 0 }, align 8 + +define void @_Z1g1S(%struct.S* %s) nounwind { +entry: + %tmp = load { i64, i64 }* @_ZL1p, align 8 + %memptr.adj = extractvalue { i64, i64 } %tmp, 1 + %0 = bitcast %struct.S* %s to i8* + %1 = getelementptr inbounds i8* %0, i64 %memptr.adj + %this.adjusted = bitcast i8* %1 to %struct.S* + %memptr.ptr = extractvalue { i64, i64 } %tmp, 0 + %2 = and i64 %memptr.ptr, 1 + %memptr.isvirtual = icmp ne i64 %2, 0 + br i1 %memptr.isvirtual, label %memptr.virtual, label %memptr.nonvirtual + +memptr.virtual: ; preds = %entry + %3 = bitcast %struct.S* %this.adjusted to i8** + %memptr.vtable = load i8** %3 + %4 = sub i64 %memptr.ptr, 1 + %5 = getelementptr i8* %memptr.vtable, i64 %4 + %6 = bitcast i8* %5 to void (%struct.S*)** + %memptr.virtualfn = load void (%struct.S*)** %6 + br label %memptr.end + +memptr.nonvirtual: ; preds = %entry + %memptr.nonvirtualfn = inttoptr i64 %memptr.ptr to void (%struct.S*)* + br label %memptr.end + +memptr.end: ; preds = %memptr.nonvirtual, %memptr.virtual + %7 = phi void (%struct.S*)* [ %memptr.virtualfn, %memptr.virtual ], [ %memptr.nonvirtualfn, %memptr.nonvirtual ] + call void %7(%struct.S* %this.adjusted) + ret void +}