1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2 3; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -S < %s | FileCheck %s 4; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -funcspec-on-address=0 -S < %s | FileCheck %s 5; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -funcspec-on-address=1 -S < %s | FileCheck %s --check-prefix=ON-ADDRESS 6 7; Global B is not constant. We do not specialise on addresses unless we 8; enable that: 9 10; ON-ADDRESS: call i32 @foo.specialized.1(i32 %x, ptr @A) 11; ON-ADDRESS: call i32 @foo.specialized.2(i32 %y, ptr @B) 12 13target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 14 15@A = external dso_local constant i32, align 4 16@B = external dso_local global i32, align 4 17 18define dso_local i32 @bar(i32 %x, i32 %y) { 19; CHECK-LABEL: @bar( 20; CHECK-NEXT: entry: 21; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[X:%.*]], 0 22; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 23; CHECK: if.then: 24; CHECK-NEXT: [[CALL:%.*]] = call i32 @foo.specialized.1(i32 [[X]], ptr @A) 25; CHECK-NEXT: br label [[RETURN:%.*]] 26; CHECK: if.else: 27; CHECK-NEXT: [[CALL1:%.*]] = call i32 @foo(i32 [[Y:%.*]], ptr @B) 28; CHECK-NEXT: br label [[RETURN]] 29; CHECK: return: 30; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL]], [[IF_THEN]] ], [ [[CALL1]], [[IF_ELSE]] ] 31; CHECK-NEXT: ret i32 [[RETVAL_0]] 32; 33entry: 34 %tobool = icmp ne i32 %x, 0 35 br i1 %tobool, label %if.then, label %if.else 36 37if.then: 38 %call = call i32 @foo(i32 %x, ptr @A) 39 br label %return 40 41if.else: 42 %call1 = call i32 @foo(i32 %y, ptr @B) 43 br label %return 44 45return: 46 %retval.0 = phi i32 [ %call, %if.then ], [ %call1, %if.else ] 47 ret i32 %retval.0 48} 49 50define internal i32 @foo(i32 %x, ptr %b) { 51; CHECK-LABEL: define internal i32 @foo( 52; CHECK-NEXT: entry: 53; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[B:%.*]], align 4 54; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X:%.*]], [[TMP0]] 55; CHECK-NEXT: ret i32 [[ADD]] 56; 57entry: 58 %0 = load i32, ptr %b, align 4 59 %add = add nsw i32 %x, %0 60 ret i32 %add 61} 62 63; CHECK-LABEL: define internal i32 @foo.specialized.1(i32 %x, ptr %b) { 64; CHECK-NEXT: entry: 65; CHECK-NEXT: %0 = load i32, ptr @A, align 4 66; CHECK-NEXT: %add = add nsw i32 %x, %0 67; CHECK-NEXT: ret i32 %add 68; CHECK-NEXT: } 69 70; CHECK-NOT: define internal i32 @foo.specialized.2( 71