1ce9d3f09SAlexandros Lamprineas; RUN: opt -passes="ipsccp<func-spec>,inline,instcombine" -force-specialization -funcspec-max-iters=1 -S < %s | FileCheck %s --check-prefix=ITERS1 2ce9d3f09SAlexandros Lamprineas; RUN: opt -passes="ipsccp<func-spec>,inline,instcombine" -force-specialization -funcspec-max-iters=2 -S < %s | FileCheck %s --check-prefix=ITERS2 3ce9d3f09SAlexandros Lamprineas; RUN: opt -passes="ipsccp<func-spec>,inline,instcombine" -force-specialization -funcspec-max-iters=3 -S < %s | FileCheck %s --check-prefix=ITERS3 4ce9d3f09SAlexandros Lamprineas; RUN: opt -passes="ipsccp<func-spec>,inline,instcombine" -force-specialization -funcspec-max-iters=4 -S < %s | FileCheck %s --check-prefix=ITERS4 5ce9d3f09SAlexandros Lamprineas 6ce9d3f09SAlexandros Lamprineas@low = internal constant i32 0, align 4 7ce9d3f09SAlexandros Lamprineas@high = internal constant i32 6, align 4 8ce9d3f09SAlexandros Lamprineas 9ce9d3f09SAlexandros Lamprineasdefine internal void @recursiveFunc(ptr nocapture readonly %lo, i32 %step, ptr nocapture readonly %hi) { 10ce9d3f09SAlexandros Lamprineas %lo.temp = alloca i32, align 4 11ce9d3f09SAlexandros Lamprineas %hi.temp = alloca i32, align 4 12ce9d3f09SAlexandros Lamprineas %lo.load = load i32, ptr %lo, align 4 13ce9d3f09SAlexandros Lamprineas %hi.load = load i32, ptr %hi, align 4 14ce9d3f09SAlexandros Lamprineas %cmp = icmp ne i32 %lo.load, %hi.load 15ce9d3f09SAlexandros Lamprineas br i1 %cmp, label %block6, label %ret.block 16ce9d3f09SAlexandros Lamprineas 17ce9d3f09SAlexandros Lamprineasblock6: 18ce9d3f09SAlexandros Lamprineas call void @print_val(i32 %lo.load, i32 %hi.load) 19ce9d3f09SAlexandros Lamprineas %add = add nsw i32 %lo.load, %step 20ce9d3f09SAlexandros Lamprineas %sub = sub nsw i32 %hi.load, %step 21ce9d3f09SAlexandros Lamprineas store i32 %add, ptr %lo.temp, align 4 22ce9d3f09SAlexandros Lamprineas store i32 %sub, ptr %hi.temp, align 4 23ce9d3f09SAlexandros Lamprineas call void @recursiveFunc(ptr nonnull %lo.temp, i32 %step, ptr nonnull %hi.temp) 24ce9d3f09SAlexandros Lamprineas br label %ret.block 25ce9d3f09SAlexandros Lamprineas 26ce9d3f09SAlexandros Lamprineasret.block: 27ce9d3f09SAlexandros Lamprineas ret void 28ce9d3f09SAlexandros Lamprineas} 29ce9d3f09SAlexandros Lamprineas 30*e15d72adSAlexandros Lamprineas; ITERS1: @specialized.arg.1 = internal constant i32 0 31*e15d72adSAlexandros Lamprineas; ITERS1: @specialized.arg.2 = internal constant i32 6 32*e15d72adSAlexandros Lamprineas; ITERS1: @specialized.arg.3 = internal constant i32 1 33*e15d72adSAlexandros Lamprineas; ITERS1: @specialized.arg.4 = internal constant i32 5 34ce9d3f09SAlexandros Lamprineas 35*e15d72adSAlexandros Lamprineas; ITERS2: @specialized.arg.1 = internal constant i32 0 36*e15d72adSAlexandros Lamprineas; ITERS2: @specialized.arg.2 = internal constant i32 6 37*e15d72adSAlexandros Lamprineas; ITERS2: @specialized.arg.3 = internal constant i32 1 38*e15d72adSAlexandros Lamprineas; ITERS2: @specialized.arg.4 = internal constant i32 5 39*e15d72adSAlexandros Lamprineas; ITERS2: @specialized.arg.5 = internal constant i32 2 40*e15d72adSAlexandros Lamprineas; ITERS2: @specialized.arg.6 = internal constant i32 4 41ce9d3f09SAlexandros Lamprineas 42*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.1 = internal constant i32 0 43*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.2 = internal constant i32 6 44*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.3 = internal constant i32 1 45*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.4 = internal constant i32 5 46*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.5 = internal constant i32 2 47*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.6 = internal constant i32 4 48*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.7 = internal constant i32 3 49*e15d72adSAlexandros Lamprineas; ITERS3: @specialized.arg.8 = internal constant i32 3 50ce9d3f09SAlexandros Lamprineas 51*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.1 = internal constant i32 0 52*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.2 = internal constant i32 6 53*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.3 = internal constant i32 1 54*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.4 = internal constant i32 5 55*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.5 = internal constant i32 2 56*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.6 = internal constant i32 4 57*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.7 = internal constant i32 3 58*e15d72adSAlexandros Lamprineas; ITERS4: @specialized.arg.8 = internal constant i32 3 59ce9d3f09SAlexandros Lamprineas 60ce9d3f09SAlexandros Lamprineasdefine i32 @main() { 61ce9d3f09SAlexandros Lamprineas; ITERS1-LABEL: @main( 62ce9d3f09SAlexandros Lamprineas; ITERS1-NEXT: call void @print_val(i32 0, i32 6) 63*e15d72adSAlexandros Lamprineas; ITERS1-NEXT: call void @recursiveFunc(ptr nonnull @specialized.arg.3, i32 1, ptr nonnull @specialized.arg.4) 64ce9d3f09SAlexandros Lamprineas; ITERS1-NEXT: ret i32 0 65ce9d3f09SAlexandros Lamprineas; 66ce9d3f09SAlexandros Lamprineas; ITERS2-LABEL: @main( 67ce9d3f09SAlexandros Lamprineas; ITERS2-NEXT: call void @print_val(i32 0, i32 6) 68ce9d3f09SAlexandros Lamprineas; ITERS2-NEXT: call void @print_val(i32 1, i32 5) 69*e15d72adSAlexandros Lamprineas; ITERS2-NEXT: call void @recursiveFunc(ptr nonnull @specialized.arg.5, i32 1, ptr nonnull @specialized.arg.6) 70ce9d3f09SAlexandros Lamprineas; ITERS2-NEXT: ret i32 0 71ce9d3f09SAlexandros Lamprineas; 72ce9d3f09SAlexandros Lamprineas; ITERS3-LABEL: @main( 73ce9d3f09SAlexandros Lamprineas; ITERS3-NEXT: call void @print_val(i32 0, i32 6) 74ce9d3f09SAlexandros Lamprineas; ITERS3-NEXT: call void @print_val(i32 1, i32 5) 75ce9d3f09SAlexandros Lamprineas; ITERS3-NEXT: call void @print_val(i32 2, i32 4) 76*e15d72adSAlexandros Lamprineas; ITERS3-NEXT: call void @recursiveFunc(ptr nonnull @specialized.arg.7, i32 1, ptr nonnull @specialized.arg.8) 77ce9d3f09SAlexandros Lamprineas; ITERS3-NEXT: ret i32 0 78ce9d3f09SAlexandros Lamprineas; 79ce9d3f09SAlexandros Lamprineas; ITERS4-LABEL: @main( 80ce9d3f09SAlexandros Lamprineas; ITERS4-NEXT: call void @print_val(i32 0, i32 6) 81ce9d3f09SAlexandros Lamprineas; ITERS4-NEXT: call void @print_val(i32 1, i32 5) 82ce9d3f09SAlexandros Lamprineas; ITERS4-NEXT: call void @print_val(i32 2, i32 4) 83ce9d3f09SAlexandros Lamprineas; ITERS4-NEXT: ret i32 0 84ce9d3f09SAlexandros Lamprineas; 85ce9d3f09SAlexandros Lamprineas %lo.temp = alloca i32, align 4 86ce9d3f09SAlexandros Lamprineas %hi.temp = alloca i32, align 4 87ce9d3f09SAlexandros Lamprineas %lo.load = load i32, ptr @low, align 4 88ce9d3f09SAlexandros Lamprineas %hi.load = load i32, ptr @high, align 4 89ce9d3f09SAlexandros Lamprineas store i32 %lo.load, ptr %lo.temp, align 4 90ce9d3f09SAlexandros Lamprineas store i32 %hi.load, ptr %hi.temp, align 4 91ce9d3f09SAlexandros Lamprineas call void @recursiveFunc(ptr nonnull %lo.temp, i32 1, ptr nonnull %hi.temp) 92ce9d3f09SAlexandros Lamprineas ret i32 0 93ce9d3f09SAlexandros Lamprineas} 94ce9d3f09SAlexandros Lamprineas 95ce9d3f09SAlexandros Lamprineasdeclare dso_local void @print_val(i32, i32) 96