From e4532f30b17dda722d4a1db5a060d6fbe2a8c352 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 15 Sep 2009 15:58:07 +0000 Subject: When a constant's type is refined, update the constant in place instead of cloning and RAUWing it. - Make AbstractTypeUser a friend of Value so that it can offer its subclasses a way to update a Value's type in place. This is better than a universally visible setType method on Value, and it's sufficient for the immediate need. - Eliminate the constant "convert" functions. This eliminates a lot of logic duplication, and fixes a complicated bug where a constant can't actually be cloned during the type refinement process because some of the types that its folder needs are half-destroyed, being in the middle of refinement themselves. - Move the getValType functions from being static overloaded functions in Constants.cpp to be members of class template specializations in ConstantsContext.h. This means that the code ends up getting instantiated twice, however it also makes it possible to eliminate all "convert" functions, so it's not a big net code size increase. And if desired, the duplicate instantiations could be eliminated with some reorganization. llvm-svn: 81861 --- llvm/test/Linker/partial-type-refinement-link.ll | 20 ++++++++++++++++++++ llvm/test/Linker/partial-type-refinement.ll | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 llvm/test/Linker/partial-type-refinement-link.ll create mode 100644 llvm/test/Linker/partial-type-refinement.ll (limited to 'llvm/test') diff --git a/llvm/test/Linker/partial-type-refinement-link.ll b/llvm/test/Linker/partial-type-refinement-link.ll new file mode 100644 index 00000000000..320ef969f83 --- /dev/null +++ b/llvm/test/Linker/partial-type-refinement-link.ll @@ -0,0 +1,20 @@ +; This file is used by first.ll, so it doesn't actually do anything itself +; RUN: true + +%AnalysisResolver = type { i8, %PMDataManager* } +%"DenseMap" = type { i64, %"pair"*, i64, i64 } +%PMDataManager = type { i8, %PMTopLevelManager*, i8, i8, i8, i8, i8, i64, i8 } +%PMTopLevelManager = type { i8, i8, i8, i8, i8, i8, i8, i8, %"DenseMap" } +%P = type { i8, %AnalysisResolver*, i64 } +%PI = type { i8, i8, i8, i8, i8, i8, %"vector", %P* } +%"SmallVImpl" = type { i8, %PI* } +%"_V_base" = type { %"_V_base::_V_impl" } +%"_V_base::_V_impl" = type { %PI*, i8, i8 } +%"pair" = type opaque +%"vector" = type { %"_V_base" } + +define void @f(%"SmallVImpl"* %this) { +entry: + %x = getelementptr inbounds %"SmallVImpl"* %this, i64 0, i32 1 + ret void +} diff --git a/llvm/test/Linker/partial-type-refinement.ll b/llvm/test/Linker/partial-type-refinement.ll new file mode 100644 index 00000000000..b995f11533f --- /dev/null +++ b/llvm/test/Linker/partial-type-refinement.ll @@ -0,0 +1,24 @@ +; RUN: llvm-link %s %p/partial-type-refinement-link.ll -S | FileCheck %s +; PR4954 + +; CHECK: load %PI** getelementptr inbounds (%"RegisterP"* @_ZN3mvmL1XE, i64 0, i32 0, i32 6, i32 0, i32 0, i32 0), align 16 + +%AnalysisResolver = type { i8, %PMDataManager* } +%"DenseMap" = type { i64, %"pair"*, i64, i64 } +%PMDataManager = type { i8, %PMTopLevelManager*, i8, i8, i8, i8, i8, i64, i8 } +%PMTopLevelManager = type { i8, i8, i8, i8, i8, i8, i8, i8, %"DenseMap" } +%P = type { i8, %AnalysisResolver*, i64 } +%PI = type { i8, i8, i8, i8, i8, i8, %"vector", %P* } +%"RegisterP" = type { %PI } +%"_V_base" = type { %"_V_base::_V_impl" } +%"_V_base::_V_impl" = type { %PI*, i8, i8 } +%"pair" = type opaque +%"vector" = type { %"_V_base" } + +@_ZN3mvmL1XE = external global %"RegisterP" + +define void @__tcf_0() nounwind { +entry: + %0 = load %PI** getelementptr inbounds (%"RegisterP"* @_ZN3mvmL1XE, i64 0, i32 0, i32 6, i32 0, i32 0, i32 0), align 16 + ret void +} -- cgit v1.2.3