1 ; This test verifies whether two identical functions, f1 and f2, can be merged
2 ; locally using the global merge function.
3 ; The functions, f1.Tgm and f2.Tgm, will be folded by the linker through
4 ; Identical Code Folding (ICF).
5 ; While identical functions can already be folded by the linker, creating this
6 ; canonical form can be beneficial in downstream passes. This merging process
7 ; can be controlled by the -global-merging-skip-no-params option.
9 ; RUN: llc -mtriple=arm64-apple-darwin -enable-global-merge-func=true -global-merging-skip-no-params=false < %s | FileCheck %s --check-prefix=MERGE
10 ; RUN: llc -mtriple=arm64-apple-darwin -enable-global-merge-func=true -global-merging-skip-no-params=true < %s | FileCheck %s --implicit-check-not=".Tgm"
15 @g = external local_unnamed_addr global [0 x i32], align 4
16 @g1 = external global i32, align 4
17 @g2 = external global i32, align 4
19 define i32 @f1(i32 %a) {
21 %idxprom = sext i32 %a to i64
22 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i64 0, i64 %idxprom
23 %0 = load i32, i32* %arrayidx, align 4
24 %1 = load volatile i32, i32* @g1, align 4
25 %mul = mul nsw i32 %1, %0
26 %add = add nsw i32 %mul, 1
30 define i32 @f2(i32 %a) {
32 %idxprom = sext i32 %a to i64
33 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i64 0, i64 %idxprom
34 %0 = load i32, i32* %arrayidx, align 4
35 %1 = load volatile i32, i32* @g1, align 4
36 %mul = mul nsw i32 %1, %0
37 %add = add nsw i32 %mul, 1