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