1c4a0969bSSjoerd Meijer; RUN: opt -function-specialization -force-function-specialization \
29e3ae8d2SSjoerd Meijer; RUN:   -func-specialization-max-clones=2 -S < %s | FileCheck %s
3c4a0969bSSjoerd Meijer
4c4a0969bSSjoerd Meijer; RUN: opt -function-specialization -force-function-specialization \
59e3ae8d2SSjoerd Meijer; RUN:   -func-specialization-max-clones=1 -S < %s | FileCheck %s --check-prefix=CONST1
6c4a0969bSSjoerd Meijer
7c4a0969bSSjoerd Meijertarget datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
8c4a0969bSSjoerd Meijer
9c4a0969bSSjoerd Meijer@A = external dso_local constant i32, align 4
10c4a0969bSSjoerd Meijer@B = external dso_local constant i32, align 4
11c4a0969bSSjoerd Meijer@C = external dso_local constant i32, align 4
12c4a0969bSSjoerd Meijer@D = external dso_local constant i32, align 4
13c4a0969bSSjoerd Meijer
14c4a0969bSSjoerd Meijerdefine dso_local i32 @bar(i32 %x, i32 %y) {
15c4a0969bSSjoerd Meijerentry:
16c4a0969bSSjoerd Meijer  %tobool = icmp ne i32 %x, 0
17c4a0969bSSjoerd Meijer  br i1 %tobool, label %if.then, label %if.else
18c4a0969bSSjoerd Meijer
19c4a0969bSSjoerd Meijerif.then:
20c4a0969bSSjoerd Meijer  %call = call i32 @foo(i32 %x, i32* @A, i32* @C)
21c4a0969bSSjoerd Meijer  br label %return
22c4a0969bSSjoerd Meijer
23c4a0969bSSjoerd Meijerif.else:
24c4a0969bSSjoerd Meijer  %call1 = call i32 @foo(i32 %y, i32* @B, i32* @D)
25c4a0969bSSjoerd Meijer  br label %return
26c4a0969bSSjoerd Meijer
27c4a0969bSSjoerd Meijerreturn:
28c4a0969bSSjoerd Meijer  %retval.0 = phi i32 [ %call, %if.then ], [ %call1, %if.else ]
29c4a0969bSSjoerd Meijer  ret i32 %retval.0
30c4a0969bSSjoerd Meijer}
31c4a0969bSSjoerd Meijer
3233830326SAlexandros Lamprineas; CHECK-NOT: define internal i32 @foo(
33c4a0969bSSjoerd Meijerdefine internal i32 @foo(i32 %x, i32* %b, i32* %c) {
34c4a0969bSSjoerd Meijerentry:
35c4a0969bSSjoerd Meijer  %0 = load i32, i32* %b, align 4
36c4a0969bSSjoerd Meijer  %add = add nsw i32 %x, %0
37c4a0969bSSjoerd Meijer  %1 = load i32, i32* %c, align 4
38c4a0969bSSjoerd Meijer  %add1 = add nsw i32 %add, %1
39c4a0969bSSjoerd Meijer  ret i32 %add1
40c4a0969bSSjoerd Meijer}
41c4a0969bSSjoerd Meijer
4278a392cfSSjoerd Meijer; CONST1:     define internal i32 @foo.1(i32 %x, i32* %b, i32* %c)
43c4a0969bSSjoerd Meijer; CONST1-NOT: define internal i32 @foo.2(i32 %x, i32* %b, i32* %c)
44c4a0969bSSjoerd Meijer
45c4a0969bSSjoerd Meijer; CHECK:        define internal i32 @foo.1(i32 %x, i32* %b, i32* %c) {
46c4a0969bSSjoerd Meijer; CHECK-NEXT:   entry:
47f8aaec19SNikita Popov; CHECK-NEXT:     %0 = load i32, i32* @A, align 4
48c4a0969bSSjoerd Meijer; CHECK-NEXT:     %add = add nsw i32 %x, %0
49*8045bf9dSAlexandros Lamprineas; CHECK-NEXT:     %1 = load i32, i32* @C, align 4
50c4a0969bSSjoerd Meijer; CHECK-NEXT:     %add1 = add nsw i32 %add, %1
51c4a0969bSSjoerd Meijer; CHECK-NEXT:     ret i32 %add1
52c4a0969bSSjoerd Meijer; CHECK-NEXT:   }
53c4a0969bSSjoerd Meijer
54c4a0969bSSjoerd Meijer; CHECK: define internal i32 @foo.2(i32 %x, i32* %b, i32* %c) {
55c4a0969bSSjoerd Meijer; CHECK-NEXT:   entry:
56f8aaec19SNikita Popov; CHECK-NEXT:     %0 = load i32, i32* @B, align 4
57c4a0969bSSjoerd Meijer; CHECK-NEXT:     %add = add nsw i32 %x, %0
58*8045bf9dSAlexandros Lamprineas; CHECK-NEXT:     %1 = load i32, i32* @D, align 4
59c4a0969bSSjoerd Meijer; CHECK-NEXT:     %add1 = add nsw i32 %add, %1
60c4a0969bSSjoerd Meijer; CHECK-NEXT:     ret i32 %add1
61c4a0969bSSjoerd Meijer; CHECK-NEXT:   }
62