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