1c4a0969bSSjoerd Meijer; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*2556f581SChuanqi Xu; RUN: opt -function-specialization -deadargelim -force-function-specialization -S < %s | FileCheck %s 3*2556f581SChuanqi Xu; RUN: opt -function-specialization -func-specialization-max-iters=1 -deadargelim -force-function-specialization -S < %s | FileCheck %s 4*2556f581SChuanqi Xu; RUN: opt -function-specialization -func-specialization-max-iters=0 -deadargelim -force-function-specialization -S < %s | FileCheck %s --check-prefix=DISABLED 5*2556f581SChuanqi Xu; RUN: opt -function-specialization -func-specialization-avg-iters-cost=1 -deadargelim -force-function-specialization -S < %s | FileCheck %s 6c4a0969bSSjoerd Meijer 7c4a0969bSSjoerd Meijer; DISABLED-NOT: @func.1( 8c4a0969bSSjoerd Meijer; DISABLED-NOT: @func.2( 9c4a0969bSSjoerd Meijer 10c4a0969bSSjoerd Meijerdefine internal i32 @func(i32* %0, i32 %1, void (i32*)* nocapture %2) { 11c4a0969bSSjoerd Meijer %4 = alloca i32, align 4 12c4a0969bSSjoerd Meijer store i32 %1, i32* %4, align 4 13c4a0969bSSjoerd Meijer %5 = load i32, i32* %4, align 4 14c4a0969bSSjoerd Meijer %6 = icmp slt i32 %5, 1 15c4a0969bSSjoerd Meijer br i1 %6, label %14, label %7 16c4a0969bSSjoerd Meijer 17c4a0969bSSjoerd Meijer7: ; preds = %3 18c4a0969bSSjoerd Meijer %8 = load i32, i32* %4, align 4 19c4a0969bSSjoerd Meijer %9 = sext i32 %8 to i64 20c4a0969bSSjoerd Meijer %10 = getelementptr inbounds i32, i32* %0, i64 %9 21c4a0969bSSjoerd Meijer call void %2(i32* %10) 22c4a0969bSSjoerd Meijer %11 = load i32, i32* %4, align 4 23c4a0969bSSjoerd Meijer %12 = add nsw i32 %11, -1 24c4a0969bSSjoerd Meijer %13 = call i32 @func(i32* %0, i32 %12, void (i32*)* %2) 25c4a0969bSSjoerd Meijer br label %14 26c4a0969bSSjoerd Meijer 27c4a0969bSSjoerd Meijer14: ; preds = %3, %7 28c4a0969bSSjoerd Meijer ret i32 0 29c4a0969bSSjoerd Meijer} 30c4a0969bSSjoerd Meijer 31c4a0969bSSjoerd Meijerdefine internal void @increment(i32* nocapture %0) { 32c4a0969bSSjoerd Meijer %2 = load i32, i32* %0, align 4 33c4a0969bSSjoerd Meijer %3 = add nsw i32 %2, 1 34c4a0969bSSjoerd Meijer store i32 %3, i32* %0, align 4 35c4a0969bSSjoerd Meijer ret void 36c4a0969bSSjoerd Meijer} 37c4a0969bSSjoerd Meijer 38c4a0969bSSjoerd Meijerdefine internal void @decrement(i32* nocapture %0) { 39c4a0969bSSjoerd Meijer %2 = load i32, i32* %0, align 4 40c4a0969bSSjoerd Meijer %3 = add nsw i32 %2, -1 41c4a0969bSSjoerd Meijer store i32 %3, i32* %0, align 4 42c4a0969bSSjoerd Meijer ret void 43c4a0969bSSjoerd Meijer} 44c4a0969bSSjoerd Meijer 45c4a0969bSSjoerd Meijerdefine i32 @main(i32* %0, i32 %1) { 46c4a0969bSSjoerd Meijer; CHECK: [[TMP3:%.*]] = call i32 @func.2(i32* [[TMP0:%.*]], i32 [[TMP1:%.*]]) 47c4a0969bSSjoerd Meijer %3 = call i32 @func(i32* %0, i32 %1, void (i32*)* nonnull @increment) 48c4a0969bSSjoerd Meijer; CHECK: [[TMP4:%.*]] = call i32 @func.1(i32* [[TMP0]], i32 [[TMP3]]) 49c4a0969bSSjoerd Meijer %4 = call i32 @func(i32* %0, i32 %3, void (i32*)* nonnull @decrement) 50c4a0969bSSjoerd Meijer ret i32 %4 51c4a0969bSSjoerd Meijer} 52c4a0969bSSjoerd Meijer 53c4a0969bSSjoerd Meijer; CHECK: @func.1( 54c4a0969bSSjoerd Meijer; CHECK: [[TMP3:%.*]] = alloca i32, align 4 55c4a0969bSSjoerd Meijer; CHECK: store i32 [[TMP1:%.*]], i32* [[TMP3]], align 4 56c4a0969bSSjoerd Meijer; CHECK: [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4 57c4a0969bSSjoerd Meijer; CHECK: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1 58c4a0969bSSjoerd Meijer; CHECK: br i1 [[TMP5]], label [[TMP13:%.*]], label [[TMP6:%.*]] 59c4a0969bSSjoerd Meijer; CHECK: 6: 60c4a0969bSSjoerd Meijer; CHECK: [[TMP7:%.*]] = load i32, i32* [[TMP3]], align 4 61c4a0969bSSjoerd Meijer; CHECK: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64 62c4a0969bSSjoerd Meijer; CHECK: [[TMP9:%.*]] = getelementptr inbounds i32, i32* [[TMP0:%.*]], i64 [[TMP8]] 63c4a0969bSSjoerd Meijer; CHECK: call void @decrement(i32* [[TMP9]]) 64c4a0969bSSjoerd Meijer; CHECK: [[TMP10:%.*]] = load i32, i32* [[TMP3]], align 4 65c4a0969bSSjoerd Meijer; CHECK: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1 66c4a0969bSSjoerd Meijer; CHECK: [[TMP12:%.*]] = call i32 @func.1(i32* [[TMP0]], i32 [[TMP11]]) 67c4a0969bSSjoerd Meijer; CHECK: br label [[TMP13]] 68c4a0969bSSjoerd Meijer; CHECK: 13: 69c4a0969bSSjoerd Meijer; CHECK: ret i32 0 70c4a0969bSSjoerd Meijer; 71c4a0969bSSjoerd Meijer; 72c4a0969bSSjoerd Meijer; CHECK: @func.2( 73c4a0969bSSjoerd Meijer; CHECK: [[TMP3:%.*]] = alloca i32, align 4 74c4a0969bSSjoerd Meijer; CHECK: store i32 [[TMP1:%.*]], i32* [[TMP3]], align 4 75c4a0969bSSjoerd Meijer; CHECK: [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4 76c4a0969bSSjoerd Meijer; CHECK: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1 77c4a0969bSSjoerd Meijer; CHECK: br i1 [[TMP5]], label [[TMP13:%.*]], label [[TMP6:%.*]] 78c4a0969bSSjoerd Meijer; CHECK: 6: 79c4a0969bSSjoerd Meijer; CHECK: [[TMP7:%.*]] = load i32, i32* [[TMP3]], align 4 80c4a0969bSSjoerd Meijer; CHECK: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64 81c4a0969bSSjoerd Meijer; CHECK: [[TMP9:%.*]] = getelementptr inbounds i32, i32* [[TMP0:%.*]], i64 [[TMP8]] 82c4a0969bSSjoerd Meijer; CHECK: call void @increment(i32* [[TMP9]]) 83c4a0969bSSjoerd Meijer; CHECK: [[TMP10:%.*]] = load i32, i32* [[TMP3]], align 4 84c4a0969bSSjoerd Meijer; CHECK: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1 85c4a0969bSSjoerd Meijer; CHECK: [[TMP12:%.*]] = call i32 @func.2(i32* [[TMP0]], i32 [[TMP11]]) 86c4a0969bSSjoerd Meijer; CHECK: br label [[TMP13]] 87c4a0969bSSjoerd Meijer; CHECK: ret i32 0 88