Index: lib/Transforms/Utils/SplitModule.cpp =================================================================== --- lib/Transforms/Utils/SplitModule.cpp +++ lib/Transforms/Utils/SplitModule.cpp @@ -88,6 +88,13 @@ Member = &GV; } + // For aliases we should not separate them from their aliasees regardless + // of linkage. + if (GlobalAlias *GA = dyn_cast(&GV)) { + if (const GlobalObject *Base = GA->getBaseObject()) + GVtoClusterMap.unionSets(&GV, cast(Base)); + } + // Further only iterate over local GVs. if (!GV.hasLocalLinkage()) return; Index: test/tools/llvm-split/scc-global-alias.ll =================================================================== --- /dev/null +++ test/tools/llvm-split/scc-global-alias.ll @@ -0,0 +1,47 @@ +; We should never separate alias from aliasee. +; RUN: llvm-split -j=3 -preserve-locals -o %t %s +; RUN: llvm-dis -o - %t0 | FileCheck --check-prefix=CHECK0 %s +; RUN: llvm-dis -o - %t1 | FileCheck --check-prefix=CHECK1 %s +; RUN: llvm-dis -o - %t2 | FileCheck --check-prefix=CHECK2 %s + +; Checks are not critical here - verifier will assert if we fail. +; CHECK0: @funInternal2Alias = alias +; CHECK0: @funExternal2Alias = alias +; CHECK0: define internal i32 @funInternal2 +; CHECK0: define i32 @funExternal2 + +; CHECK1: @funInternalAlias = alias +; CHECK1: define internal i32 @funInternal + +; CHECK2: @funExternalAlias = alias +; CHECK2: define i32 @funExternal + +@funInternalAlias = alias i32 (), i32 ()* @funInternal +@funExternalAlias = alias i32 (), i32 ()* @funExternal +@funInternal2Alias = alias i32 (), i32 ()* @funInternal2 +@funExternal2Alias = alias i32 (), i32 ()* @funExternal2 + +define internal i32 @funInternal() { +entry: + ret i32 0 +} + +define i32 @funExternal() { +entry: + %x = call i32 @funInternalAlias() + ret i32 %x +} + +define internal i32 @funInternal2() { +entry: + %x = call i32 @funInternalAlias() + ret i32 %x +} + +define i32 @funExternal2() { +entry: + %x = call i32 @funInternal2() + %y = call i32 @funExternalAlias() + %z = add nsw i32 %x, %y + ret i32 %z +}