216 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 52; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -force-specialization -S < %s | FileCheck %s3; 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-ITER4; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -funcspec-max-iters=0 -force-specialization -S < %s | FileCheck %s --check-prefix=DISABLED5 6 7define internal i32 @func(ptr %0, i32 %1, ptr nocapture %2) {8 %4 = alloca i32, align 49 store i32 %1, ptr %4, align 410 %5 = load i32, ptr %4, align 411 %6 = icmp slt i32 %5, 112 br i1 %6, label %14, label %713 147: ; preds = %315 %8 = load i32, ptr %4, align 416 %9 = sext i32 %8 to i6417 %10 = getelementptr inbounds i32, ptr %0, i64 %918 call void %2(ptr %10)19 %11 = load i32, ptr %4, align 420 %12 = add nsw i32 %11, -121 %13 = call i32 @func(ptr %0, i32 %12, ptr %2)22 br label %1423 2414: ; preds = %3, %725 ret i32 026}27 28define internal void @increment(ptr nocapture %0) {29 %2 = load i32, ptr %0, align 430 %3 = add nsw i32 %2, 131 store i32 %3, ptr %0, align 432 ret void33}34 35define internal void @decrement(ptr nocapture %0) {36 %2 = load i32, ptr %0, align 437 %3 = add nsw i32 %2, -138 store i32 %3, ptr %0, align 439 ret void40}41 42define i32 @main(ptr %0, i32 %1) {43 %3 = call i32 @func(ptr %0, i32 %1, ptr nonnull @increment)44 %4 = call i32 @func(ptr %0, i32 %3, ptr nonnull @decrement)45 ret i32 %446}47 48; CHECK-LABEL: define internal void @increment(49; CHECK-SAME: ptr captures(none) [[TMP0:%.*]]) {50; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 451; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 152; CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 453; CHECK-NEXT: ret void54;55;56; CHECK-LABEL: define internal void @decrement(57; CHECK-SAME: ptr captures(none) [[TMP0:%.*]]) {58; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 459; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -160; CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 461; CHECK-NEXT: ret void62;63;64; CHECK-LABEL: define i32 @main(65; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {66; CHECK-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]])67; CHECK-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 0)68; CHECK-NEXT: ret i32 069;70;71; CHECK-LABEL: define internal void @func.specialized.1(72; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {73; CHECK-NEXT: [[TMP2:%.*]] = alloca i32, align 474; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP2]], align 475; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 476; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 177; CHECK-NEXT: br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]]78; CHECK: [[BB6]]:79; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 480; CHECK-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i6481; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]82; CHECK-NEXT: call void @decrement(ptr [[TMP8]])83; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 484; CHECK-NEXT: [[TMP10:%.*]] = add nsw i32 [[TMP9]], -185; CHECK-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 [[TMP10]])86; CHECK-NEXT: br label %[[BB12]]87; CHECK: [[BB12]]:88; CHECK-NEXT: ret void89;90;91; CHECK-LABEL: define internal void @func.specialized.2(92; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {93; CHECK-NEXT: [[TMP3:%.*]] = alloca i32, align 494; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP3]], align 495; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 496; CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 197; CHECK-NEXT: br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]]98; CHECK: [[BB6]]:99; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4100; CHECK-NEXT: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64101; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]]102; CHECK-NEXT: call void @increment(ptr [[TMP9]])103; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4104; CHECK-NEXT: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1105; CHECK-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]])106; CHECK-NEXT: br label %[[BB12]]107; CHECK: [[BB12]]:108; CHECK-NEXT: ret void109;110;111; ONE-ITER-LABEL: define internal void @increment(112; ONE-ITER-SAME: ptr captures(none) [[TMP0:%.*]]) {113; ONE-ITER-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4114; ONE-ITER-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1115; ONE-ITER-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4116; ONE-ITER-NEXT: ret void117;118;119; ONE-ITER-LABEL: define internal void @decrement(120; ONE-ITER-SAME: ptr captures(none) [[TMP0:%.*]]) {121; ONE-ITER-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4122; ONE-ITER-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1123; ONE-ITER-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4124; ONE-ITER-NEXT: ret void125;126;127; ONE-ITER-LABEL: define i32 @main(128; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {129; ONE-ITER-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]])130; ONE-ITER-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 0)131; ONE-ITER-NEXT: ret i32 0132;133;134; ONE-ITER-LABEL: define internal void @func.specialized.1(135; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {136; ONE-ITER-NEXT: [[TMP2:%.*]] = alloca i32, align 4137; ONE-ITER-NEXT: store i32 [[TMP1]], ptr [[TMP2]], align 4138; ONE-ITER-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4139; ONE-ITER-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1140; ONE-ITER-NEXT: br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]]141; ONE-ITER: [[BB6]]:142; ONE-ITER-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4143; ONE-ITER-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i64144; ONE-ITER-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]145; ONE-ITER-NEXT: call void @decrement(ptr [[TMP8]])146; ONE-ITER-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4147; ONE-ITER-NEXT: [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1148; ONE-ITER-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 [[TMP10]])149; ONE-ITER-NEXT: br label %[[BB12]]150; ONE-ITER: [[BB12]]:151; ONE-ITER-NEXT: ret void152;153;154; ONE-ITER-LABEL: define internal void @func.specialized.2(155; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {156; ONE-ITER-NEXT: [[TMP3:%.*]] = alloca i32, align 4157; ONE-ITER-NEXT: store i32 [[TMP1]], ptr [[TMP3]], align 4158; ONE-ITER-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4159; ONE-ITER-NEXT: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1160; ONE-ITER-NEXT: br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]]161; ONE-ITER: [[BB6]]:162; ONE-ITER-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4163; ONE-ITER-NEXT: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64164; ONE-ITER-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]]165; ONE-ITER-NEXT: call void @increment(ptr [[TMP9]])166; ONE-ITER-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4167; ONE-ITER-NEXT: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1168; ONE-ITER-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]])169; ONE-ITER-NEXT: br label %[[BB12]]170; ONE-ITER: [[BB12]]:171; ONE-ITER-NEXT: ret void172;173;174; DISABLED-LABEL: define internal void @func(175; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]], ptr captures(none) [[TMP2:%.*]]) {176; DISABLED-NEXT: [[TMP4:%.*]] = alloca i32, align 4177; DISABLED-NEXT: store i32 [[TMP1]], ptr [[TMP4]], align 4178; DISABLED-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4179; DISABLED-NEXT: [[TMP6:%.*]] = icmp slt i32 [[TMP5]], 1180; DISABLED-NEXT: br i1 [[TMP6]], label %[[BB13:.*]], label %[[BB7:.*]]181; DISABLED: [[BB7]]:182; DISABLED-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP4]], align 4183; DISABLED-NEXT: [[TMP9:%.*]] = sext i32 [[TMP8]] to i64184; DISABLED-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP9]]185; DISABLED-NEXT: call void [[TMP2]](ptr [[TMP10]])186; DISABLED-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP4]], align 4187; DISABLED-NEXT: [[TMP12:%.*]] = add nsw i32 [[TMP11]], -1188; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP12]], ptr [[TMP2]])189; DISABLED-NEXT: br label %[[BB13]]190; DISABLED: [[BB13]]:191; DISABLED-NEXT: ret void192;193;194; DISABLED-LABEL: define internal void @increment(195; DISABLED-SAME: ptr captures(none) [[TMP0:%.*]]) {196; DISABLED-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4197; DISABLED-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1198; DISABLED-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4199; DISABLED-NEXT: ret void200;201;202; DISABLED-LABEL: define internal void @decrement(203; DISABLED-SAME: ptr captures(none) [[TMP0:%.*]]) {204; DISABLED-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4205; DISABLED-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1206; DISABLED-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4207; DISABLED-NEXT: ret void208;209;210; DISABLED-LABEL: define i32 @main(211; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {212; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP1]], ptr nonnull @increment)213; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 0, ptr nonnull @decrement)214; DISABLED-NEXT: ret i32 0215;216