1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -function-specialization -inline -instcombine -S < %s | FileCheck %s
3
4; TODO: this is a case that would be interesting to support, but we don't yet
5; at the moment.
6
7@Global = internal constant i32 1, align 4
8
9define internal void @recursiveFunc(i32* nocapture readonly %arg) {
10; CHECK-LABEL: @recursiveFunc(
11; CHECK-NEXT:    [[TEMP:%.*]] = alloca i32, align 4
12; CHECK-NEXT:    [[ARG_LOAD:%.*]] = load i32, i32* [[ARG:%.*]], align 4
13; CHECK-NEXT:    [[ARG_CMP:%.*]] = icmp slt i32 [[ARG_LOAD]], 4
14; CHECK-NEXT:    br i1 [[ARG_CMP]], label [[BLOCK6:%.*]], label [[RET_BLOCK:%.*]]
15; CHECK:       block6:
16; CHECK-NEXT:    call void @print_val(i32 [[ARG_LOAD]])
17; CHECK-NEXT:    [[ARG_ADD:%.*]] = add nsw i32 [[ARG_LOAD]], 1
18; CHECK-NEXT:    store i32 [[ARG_ADD]], i32* [[TEMP]], align 4
19; CHECK-NEXT:    call void @recursiveFunc(i32* nonnull [[TEMP]])
20; CHECK-NEXT:    br label [[RET_BLOCK]]
21; CHECK:       ret.block:
22; CHECK-NEXT:    ret void
23;
24  %temp = alloca i32, align 4
25  %arg.load = load i32, i32* %arg, align 4
26  %arg.cmp = icmp slt i32 %arg.load, 4
27  br i1 %arg.cmp, label %block6, label %ret.block
28
29block6:
30  call void @print_val(i32 %arg.load)
31  %arg.add = add nsw i32 %arg.load, 1
32  store i32 %arg.add, i32* %temp, align 4
33  call void @recursiveFunc(i32* nonnull %temp)
34  br label %ret.block
35
36ret.block:
37  ret void
38}
39
40define i32 @main() {
41; CHECK-LABEL: @main(
42; CHECK-NEXT:    call void @recursiveFunc(i32* nonnull @Global)
43; CHECK-NEXT:    ret i32 0
44;
45  call void @recursiveFunc(i32* nonnull @Global)
46  ret i32 0
47}
48
49declare dso_local void @print_val(i32)
50