| // RUN: %target-sil-opt -enable-sil-verify-all %s -loop-info-printer 2>&1 | FileCheck %s |
| |
| // REQUIRES: asserts |
| |
| import Builtin |
| import Swift |
| |
| sil_stage canonical |
| |
| // CHECK-LABEL: Loops in simple_loop_with_enum |
| // CHECK: Loop at depth 1 containing: bb1<header>,bb3,bb2,bb4<exiting>,bb5<latch> |
| |
| sil @simple_loop_with_enum : $@convention(thin) () -> () { |
| bb0: |
| %0 = integer_literal $Builtin.Int32, 0 |
| %1 = integer_literal $Builtin.Int32, 1000 |
| br bb1(%0 : $Builtin.Int32) |
| |
| bb1(%3 : $Builtin.Int32): |
| %4 = struct $Int32 (%3 : $Builtin.Int32) |
| %6 = builtin "cmp_eq_Int32"(%3 : $Builtin.Int32, %1 : $Builtin.Int32) : $Builtin.Int1 |
| cond_br %6, bb2, bb3 |
| |
| bb2: |
| %8 = enum $Optional<Int32>, #Optional.none!enumelt |
| br bb4(%3 : $Builtin.Int32, %8 : $Optional<Int32>) |
| |
| bb3: |
| %10 = integer_literal $Builtin.Int32, 1 |
| %12 = integer_literal $Builtin.Int1, -1 |
| %13 = builtin "sadd_with_overflow_Int32"(%3 : $Builtin.Int32, %10 : $Builtin.Int32, %12 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) |
| %14 = tuple_extract %13 : $(Builtin.Int32, Builtin.Int1), 0 |
| %15 = tuple_extract %13 : $(Builtin.Int32, Builtin.Int1), 1 |
| cond_fail %15 : $Builtin.Int1 |
| %17 = enum $Optional<Int32>, #Optional.some!enumelt.1, %4 : $Int32 |
| br bb4(%14 : $Builtin.Int32, %17 : $Optional<Int32>) |
| |
| bb4(%19 : $Builtin.Int32, %20 : $Optional<Int32>): |
| switch_enum %20 : $Optional<Int32>, case #Optional.some!enumelt.1: bb5, case #Optional.none!enumelt: bb6 |
| |
| bb5: |
| br bb1(%19 : $Builtin.Int32) |
| |
| bb6: |
| %23 = tuple () |
| return %23 : $() |
| } |
| |
| // CHECK-LABEL: Loops in simple_loop |
| // CHECK: Loop at depth 1 containing: bb1<header><exiting>,bb2<latch> |
| |
| sil @simple_loop : $@convention(thin) () -> () { |
| bb0: |
| %0 = integer_literal $Builtin.Int32, 0 |
| %1 = integer_literal $Builtin.Int32, 1000 |
| br bb1(%0 : $Builtin.Int32) |
| |
| bb1(%3 : $Builtin.Int32): |
| %4 = struct $Int32 (%3 : $Builtin.Int32) |
| %6 = builtin "cmp_eq_Int32"(%3 : $Builtin.Int32, %1 : $Builtin.Int32) : $Builtin.Int1 |
| cond_br %6, bb3, bb2 |
| |
| bb2: |
| %8 = integer_literal $Builtin.Int32, 1 |
| %10 = integer_literal $Builtin.Int1, -1 |
| %11 = builtin "sadd_with_overflow_Int32"(%3 : $Builtin.Int32, %8 : $Builtin.Int32, %10 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) |
| %12 = tuple_extract %11 : $(Builtin.Int32, Builtin.Int1), 0 |
| %13 = tuple_extract %11 : $(Builtin.Int32, Builtin.Int1), 1 |
| cond_fail %13 : $Builtin.Int1 |
| %15 = enum $Optional<Int32>, #Optional.some!enumelt.1, %4 : $Int32 |
| br bb1(%12 : $Builtin.Int32) |
| |
| bb3: |
| %17 = tuple () |
| return %17 : $() |
| } |
| |
| // CHECK-LABEL: nested_loop |
| // CHECK: Loop at depth 1 containing: bb1<header><exiting>,bb2,bb4,bb5,bb6<latch> |
| // CHECK: Loop at depth 2 containing: bb4<header><exiting>,bb5<latch> |
| |
| sil @nested_loop : $@convention(thin) () -> () { |
| bb0: |
| %0 = integer_literal $Builtin.Int32, 0 |
| %1 = integer_literal $Builtin.Int32, 1000 |
| br bb1(%0 : $Builtin.Int32) |
| |
| bb1(%3 : $Builtin.Int32): |
| %5 = builtin "cmp_eq_Int32"(%3 : $Builtin.Int32, %1 : $Builtin.Int32) : $Builtin.Int1 |
| cond_br %5, bb3, bb2 |
| |
| bb2: |
| %7 = integer_literal $Builtin.Int32, 1 |
| %9 = integer_literal $Builtin.Int1, -1 |
| %10 = builtin "sadd_with_overflow_Int32"(%3 : $Builtin.Int32, %7 : $Builtin.Int32, %9 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) |
| %11 = tuple_extract %10 : $(Builtin.Int32, Builtin.Int1), 0 |
| %12 = tuple_extract %10 : $(Builtin.Int32, Builtin.Int1), 1 |
| cond_fail %12 : $Builtin.Int1 |
| %14 = integer_literal $Builtin.Int32, 2000 |
| br bb4(%0 : $Builtin.Int32) |
| |
| bb3: |
| %16 = tuple () |
| return %16 : $() |
| |
| bb4(%18 : $Builtin.Int32): |
| %19 = builtin "cmp_eq_Int32"(%18 : $Builtin.Int32, %14 : $Builtin.Int32) : $Builtin.Int1 |
| cond_br %19, bb6, bb5 |
| |
| bb5: |
| %21 = integer_literal $Builtin.Int32, 1 |
| %23 = integer_literal $Builtin.Int1, -1 |
| %24 = builtin "sadd_with_overflow_Int32"(%18 : $Builtin.Int32, %21 : $Builtin.Int32, %23 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1) |
| %25 = tuple_extract %24 : $(Builtin.Int32, Builtin.Int1), 0 |
| %26 = tuple_extract %24 : $(Builtin.Int32, Builtin.Int1), 1 |
| cond_fail %26 : $Builtin.Int1 |
| br bb4(%25 : $Builtin.Int32) |
| |
| bb6: |
| br bb1(%11 : $Builtin.Int32) |
| } |