| ; This test verifies whether two identical functions, f1 and f2, can be merged |
| ; locally using the global merge function. |
| ; The functions, f1.Tgm and f2.Tgm, will be folded by the linker through |
| ; Identical Code Folding (ICF). |
| ; While identical functions can already be folded by the linker, creating this |
| ; canonical form can be beneficial in downstream passes. This merging process |
| ; can be controlled by the -global-merging-skip-no-params option. |
| |
| ; RUN: llc -mtriple=arm64-apple-darwin -enable-global-merge-func=true -global-merging-skip-no-params=false < %s | FileCheck %s --check-prefix=MERGE |
| ; RUN: llc -mtriple=arm64-apple-darwin -enable-global-merge-func=true -global-merging-skip-no-params=true < %s | FileCheck %s --implicit-check-not=".Tgm" |
| |
| ; MERGE: _f1.Tgm |
| ; MERGE: _f2.Tgm |
| |
| @g = external local_unnamed_addr global [0 x i32], align 4 |
| @g1 = external global i32, align 4 |
| @g2 = external global i32, align 4 |
| |
| define i32 @f1(i32 %a) { |
| entry: |
| %idxprom = sext i32 %a to i64 |
| %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i64 0, i64 %idxprom |
| %0 = load i32, i32* %arrayidx, align 4 |
| %1 = load volatile i32, i32* @g1, align 4 |
| %mul = mul nsw i32 %1, %0 |
| %add = add nsw i32 %mul, 1 |
| ret i32 %add |
| } |
| |
| define i32 @f2(i32 %a) { |
| entry: |
| %idxprom = sext i32 %a to i64 |
| %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i64 0, i64 %idxprom |
| %0 = load i32, i32* %arrayidx, align 4 |
| %1 = load volatile i32, i32* @g1, align 4 |
| %mul = mul nsw i32 %1, %0 |
| %add = add nsw i32 %mul, 1 |
| ret i32 %add |
| } |