1d68083feSHari Limaye; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 5 206664fdcSHari Limaye; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -force-specialization -S < %s | FileCheck %s 306664fdcSHari Limaye; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -funcspec-max-iters=1 -force-specialization -S < %s | FileCheck %s --check-prefix=ONE-ITER 406664fdcSHari Limaye; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -funcspec-max-iters=0 -force-specialization -S < %s | FileCheck %s --check-prefix=DISABLED 596a14f38SNikita Popov 696a14f38SNikita Popov 796a14f38SNikita Popovdefine internal i32 @func(ptr %0, i32 %1, ptr nocapture %2) { 896a14f38SNikita Popov %4 = alloca i32, align 4 996a14f38SNikita Popov store i32 %1, ptr %4, align 4 1096a14f38SNikita Popov %5 = load i32, ptr %4, align 4 1196a14f38SNikita Popov %6 = icmp slt i32 %5, 1 1296a14f38SNikita Popov br i1 %6, label %14, label %7 1396a14f38SNikita Popov 1496a14f38SNikita Popov7: ; preds = %3 1596a14f38SNikita Popov %8 = load i32, ptr %4, align 4 1696a14f38SNikita Popov %9 = sext i32 %8 to i64 1796a14f38SNikita Popov %10 = getelementptr inbounds i32, ptr %0, i64 %9 1896a14f38SNikita Popov call void %2(ptr %10) 1996a14f38SNikita Popov %11 = load i32, ptr %4, align 4 2096a14f38SNikita Popov %12 = add nsw i32 %11, -1 2196a14f38SNikita Popov %13 = call i32 @func(ptr %0, i32 %12, ptr %2) 2296a14f38SNikita Popov br label %14 2396a14f38SNikita Popov 2496a14f38SNikita Popov14: ; preds = %3, %7 2596a14f38SNikita Popov ret i32 0 2696a14f38SNikita Popov} 2796a14f38SNikita Popov 2896a14f38SNikita Popovdefine internal void @increment(ptr nocapture %0) { 2996a14f38SNikita Popov %2 = load i32, ptr %0, align 4 3096a14f38SNikita Popov %3 = add nsw i32 %2, 1 3196a14f38SNikita Popov store i32 %3, ptr %0, align 4 3296a14f38SNikita Popov ret void 3396a14f38SNikita Popov} 3496a14f38SNikita Popov 3596a14f38SNikita Popovdefine internal void @decrement(ptr nocapture %0) { 3696a14f38SNikita Popov %2 = load i32, ptr %0, align 4 3796a14f38SNikita Popov %3 = add nsw i32 %2, -1 3896a14f38SNikita Popov store i32 %3, ptr %0, align 4 3996a14f38SNikita Popov ret void 4096a14f38SNikita Popov} 4196a14f38SNikita Popov 4296a14f38SNikita Popovdefine i32 @main(ptr %0, i32 %1) { 4396a14f38SNikita Popov %3 = call i32 @func(ptr %0, i32 %1, ptr nonnull @increment) 4496a14f38SNikita Popov %4 = call i32 @func(ptr %0, i32 %3, ptr nonnull @decrement) 4596a14f38SNikita Popov ret i32 %4 4696a14f38SNikita Popov} 4796a14f38SNikita Popov 48d68083feSHari Limaye; CHECK-LABEL: define internal void @increment( 49*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) [[TMP0:%.*]]) { 50d68083feSHari Limaye; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4 51d68083feSHari Limaye; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1 52d68083feSHari Limaye; CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4 53d68083feSHari Limaye; CHECK-NEXT: ret void 5496a14f38SNikita Popov; 5596a14f38SNikita Popov; 56d68083feSHari Limaye; CHECK-LABEL: define internal void @decrement( 57*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) [[TMP0:%.*]]) { 58d68083feSHari Limaye; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4 59d68083feSHari Limaye; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1 60d68083feSHari Limaye; CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4 61d68083feSHari Limaye; CHECK-NEXT: ret void 62d68083feSHari Limaye; 63d68083feSHari Limaye; 64d68083feSHari Limaye; CHECK-LABEL: define i32 @main( 65d68083feSHari Limaye; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 66d68083feSHari Limaye; CHECK-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]]) 67d68083feSHari Limaye; CHECK-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 0) 68d68083feSHari Limaye; CHECK-NEXT: ret i32 0 69d68083feSHari Limaye; 70d68083feSHari Limaye; 71d68083feSHari Limaye; CHECK-LABEL: define internal void @func.specialized.1( 72d68083feSHari Limaye; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 73d68083feSHari Limaye; CHECK-NEXT: [[TMP2:%.*]] = alloca i32, align 4 74d68083feSHari Limaye; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP2]], align 4 75d68083feSHari Limaye; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 76d68083feSHari Limaye; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1 77d68083feSHari Limaye; CHECK-NEXT: br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]] 78d68083feSHari Limaye; CHECK: [[BB6]]: 79d68083feSHari Limaye; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4 80d68083feSHari Limaye; CHECK-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i64 81d68083feSHari Limaye; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]] 82d68083feSHari Limaye; CHECK-NEXT: call void @decrement(ptr [[TMP8]]) 83d68083feSHari Limaye; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4 84d68083feSHari Limaye; CHECK-NEXT: [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1 85d68083feSHari Limaye; CHECK-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 [[TMP10]]) 86d68083feSHari Limaye; CHECK-NEXT: br label %[[BB12]] 87d68083feSHari Limaye; CHECK: [[BB12]]: 88d68083feSHari Limaye; CHECK-NEXT: ret void 89d68083feSHari Limaye; 90d68083feSHari Limaye; 91d68083feSHari Limaye; CHECK-LABEL: define internal void @func.specialized.2( 92d68083feSHari Limaye; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 93d68083feSHari Limaye; CHECK-NEXT: [[TMP3:%.*]] = alloca i32, align 4 94d68083feSHari Limaye; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP3]], align 4 95d68083feSHari Limaye; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4 96d68083feSHari Limaye; CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1 97d68083feSHari Limaye; CHECK-NEXT: br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]] 98d68083feSHari Limaye; CHECK: [[BB6]]: 99d68083feSHari Limaye; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4 100d68083feSHari Limaye; CHECK-NEXT: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64 101d68083feSHari Limaye; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]] 102d68083feSHari Limaye; CHECK-NEXT: call void @increment(ptr [[TMP9]]) 103d68083feSHari Limaye; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4 104d68083feSHari Limaye; CHECK-NEXT: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1 105d68083feSHari Limaye; CHECK-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]]) 106d68083feSHari Limaye; CHECK-NEXT: br label %[[BB12]] 107d68083feSHari Limaye; CHECK: [[BB12]]: 108d68083feSHari Limaye; CHECK-NEXT: ret void 109d68083feSHari Limaye; 110d68083feSHari Limaye; 111d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @increment( 112*29441e4fSNikita Popov; ONE-ITER-SAME: ptr captures(none) [[TMP0:%.*]]) { 113d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4 114d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1 115d68083feSHari Limaye; ONE-ITER-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4 116d68083feSHari Limaye; ONE-ITER-NEXT: ret void 117d68083feSHari Limaye; 118d68083feSHari Limaye; 119d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @decrement( 120*29441e4fSNikita Popov; ONE-ITER-SAME: ptr captures(none) [[TMP0:%.*]]) { 121d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4 122d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1 123d68083feSHari Limaye; ONE-ITER-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4 124d68083feSHari Limaye; ONE-ITER-NEXT: ret void 125d68083feSHari Limaye; 126d68083feSHari Limaye; 127d68083feSHari Limaye; ONE-ITER-LABEL: define i32 @main( 128d68083feSHari Limaye; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 129d68083feSHari Limaye; ONE-ITER-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]]) 130d68083feSHari Limaye; ONE-ITER-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 0) 131d68083feSHari Limaye; ONE-ITER-NEXT: ret i32 0 132d68083feSHari Limaye; 133d68083feSHari Limaye; 134d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @func.specialized.1( 135d68083feSHari Limaye; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 136d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP2:%.*]] = alloca i32, align 4 137d68083feSHari Limaye; ONE-ITER-NEXT: store i32 [[TMP1]], ptr [[TMP2]], align 4 138d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 139d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1 140d68083feSHari Limaye; ONE-ITER-NEXT: br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]] 141d68083feSHari Limaye; ONE-ITER: [[BB6]]: 142d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4 143d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i64 144d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]] 145d68083feSHari Limaye; ONE-ITER-NEXT: call void @decrement(ptr [[TMP8]]) 146d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4 147d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1 148d68083feSHari Limaye; ONE-ITER-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 [[TMP10]]) 149d68083feSHari Limaye; ONE-ITER-NEXT: br label %[[BB12]] 150d68083feSHari Limaye; ONE-ITER: [[BB12]]: 151d68083feSHari Limaye; ONE-ITER-NEXT: ret void 152d68083feSHari Limaye; 153d68083feSHari Limaye; 154d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @func.specialized.2( 155d68083feSHari Limaye; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 156d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP3:%.*]] = alloca i32, align 4 157d68083feSHari Limaye; ONE-ITER-NEXT: store i32 [[TMP1]], ptr [[TMP3]], align 4 158d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4 159d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1 160d68083feSHari Limaye; ONE-ITER-NEXT: br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]] 161d68083feSHari Limaye; ONE-ITER: [[BB6]]: 162d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4 163d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64 164d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]] 165d68083feSHari Limaye; ONE-ITER-NEXT: call void @increment(ptr [[TMP9]]) 166d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4 167d68083feSHari Limaye; ONE-ITER-NEXT: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1 168d68083feSHari Limaye; ONE-ITER-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]]) 169d68083feSHari Limaye; ONE-ITER-NEXT: br label %[[BB12]] 170d68083feSHari Limaye; ONE-ITER: [[BB12]]: 171d68083feSHari Limaye; ONE-ITER-NEXT: ret void 172d68083feSHari Limaye; 173d68083feSHari Limaye; 174d68083feSHari Limaye; DISABLED-LABEL: define internal void @func( 175*29441e4fSNikita Popov; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]], ptr captures(none) [[TMP2:%.*]]) { 176d68083feSHari Limaye; DISABLED-NEXT: [[TMP4:%.*]] = alloca i32, align 4 177d68083feSHari Limaye; DISABLED-NEXT: store i32 [[TMP1]], ptr [[TMP4]], align 4 178d68083feSHari Limaye; DISABLED-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4 179d68083feSHari Limaye; DISABLED-NEXT: [[TMP6:%.*]] = icmp slt i32 [[TMP5]], 1 180d68083feSHari Limaye; DISABLED-NEXT: br i1 [[TMP6]], label %[[BB13:.*]], label %[[BB7:.*]] 181d68083feSHari Limaye; DISABLED: [[BB7]]: 182d68083feSHari Limaye; DISABLED-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP4]], align 4 183d68083feSHari Limaye; DISABLED-NEXT: [[TMP9:%.*]] = sext i32 [[TMP8]] to i64 184d68083feSHari Limaye; DISABLED-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP9]] 185d68083feSHari Limaye; DISABLED-NEXT: call void [[TMP2]](ptr [[TMP10]]) 186d68083feSHari Limaye; DISABLED-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP4]], align 4 187d68083feSHari Limaye; DISABLED-NEXT: [[TMP12:%.*]] = add nsw i32 [[TMP11]], -1 188d68083feSHari Limaye; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP12]], ptr [[TMP2]]) 189d68083feSHari Limaye; DISABLED-NEXT: br label %[[BB13]] 190d68083feSHari Limaye; DISABLED: [[BB13]]: 191d68083feSHari Limaye; DISABLED-NEXT: ret void 192d68083feSHari Limaye; 193d68083feSHari Limaye; 194d68083feSHari Limaye; DISABLED-LABEL: define internal void @increment( 195*29441e4fSNikita Popov; DISABLED-SAME: ptr captures(none) [[TMP0:%.*]]) { 196d68083feSHari Limaye; DISABLED-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4 197d68083feSHari Limaye; DISABLED-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1 198d68083feSHari Limaye; DISABLED-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4 199d68083feSHari Limaye; DISABLED-NEXT: ret void 200d68083feSHari Limaye; 201d68083feSHari Limaye; 202d68083feSHari Limaye; DISABLED-LABEL: define internal void @decrement( 203*29441e4fSNikita Popov; DISABLED-SAME: ptr captures(none) [[TMP0:%.*]]) { 204d68083feSHari Limaye; DISABLED-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4 205d68083feSHari Limaye; DISABLED-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1 206d68083feSHari Limaye; DISABLED-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4 207d68083feSHari Limaye; DISABLED-NEXT: ret void 208d68083feSHari Limaye; 209d68083feSHari Limaye; 210d68083feSHari Limaye; DISABLED-LABEL: define i32 @main( 211d68083feSHari Limaye; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 212d68083feSHari Limaye; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP1]], ptr nonnull @increment) 213d68083feSHari Limaye; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 0, ptr nonnull @decrement) 214d68083feSHari Limaye; DISABLED-NEXT: ret i32 0 215d68083feSHari Limaye; 216