diff --git a/lib/Transforms/IPO/MergeFunctions.cpp b/lib/Transforms/IPO/MergeFunctions.cpp index 0f09b9026eb..7e4c1668455 100644 --- a/lib/Transforms/IPO/MergeFunctions.cpp +++ b/lib/Transforms/IPO/MergeFunctions.cpp @@ -836,6 +836,18 @@ bool MergeFunctions::insert(ComparableFunction &NewF) { const ComparableFunction &OldF = *Result.first; + // Don't merge tiny functions, since it can just end up making the function + // larger. + // FIXME: Should still merge them if they are unnamed_addr and produce an + // alias. + if (NewF.getFunc()->size() == 1) { + if (NewF.getFunc()->front().size() <= 2) { + DEBUG(dbgs() << NewF.getFunc()->getName() + << " is to small to bother merging\n"); + return false; + } + } + // Never thunk a strong function to a weak function. assert(!OldF.getFunc()->mayBeOverridden() || NewF.getFunc()->mayBeOverridden()); diff --git a/test/Transforms/MergeFunc/merge-ptr-and-int.ll b/test/Transforms/MergeFunc/merge-ptr-and-int.ll index 7a178a21139..4e887cec906 100644 --- a/test/Transforms/MergeFunc/merge-ptr-and-int.ll +++ b/test/Transforms/MergeFunc/merge-ptr-and-int.ll @@ -1,18 +1,27 @@ ; RUN: opt -S -mergefunc < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -; CHECK-LABEL: f0 + +declare void @stuff() + +; CHECK-LABEL: @f0( define void @f0(i64 %p0) { entry: + call void @stuff() + call void @stuff() + call void @stuff() ret void } -; CHECK-LABEL: f1 +; CHECK-LABEL: @f1( ; CHECK: ptrtoint i64* ; CHECK: tail call void @f0(i64 define void @f1(i64* %p0) { entry: + call void @stuff() + call void @stuff() + call void @stuff() ret void } diff --git a/test/Transforms/MergeFunc/too-small.ll b/test/Transforms/MergeFunc/too-small.ll new file mode 100644 index 00000000000..1a526ffd50a --- /dev/null +++ b/test/Transforms/MergeFunc/too-small.ll @@ -0,0 +1,14 @@ +; RUN: opt -S -mergefunc < %s | FileCheck %s + +define void @foo(i32 %x) { +; CHECK-LABEL: @foo( +; CHECK-NOT: call + ret void +} + +define void @bar(i32 %x) { +; CHECK-LABEL: @bar( +; CHECK-NOT: call + ret void +} +