| // RUN: %target-sil-opt -enable-sil-verify-all %s -simplify-cfg | FileCheck %s |
| |
| sil_stage canonical |
| |
| import Builtin |
| |
| // CHECK-LABEL: sil @test_jump_threading |
| // CHECK: bb4(%{{[0-9]+}} : $Builtin.Int64): |
| // CHECK-NEXT: br bb1 |
| sil @test_jump_threading : $@convention(thin) (Builtin.Int1) -> () { |
| bb0(%0 : $Builtin.Int1): |
| cond_br %0, bb2, bb3 |
| |
| // Blocks are handled from last to first. Block bb1 is placed here so that its argument |
| // is not optimized before jump threading is done in bb2 and bb3. |
| bb1(%i4 : $Builtin.Int64): |
| %f3 = function_ref @get_condition : $@convention(thin) (Builtin.Int64) -> Builtin.Int1 |
| %c1 = apply %f3(%i3) : $@convention(thin) (Builtin.Int64) -> Builtin.Int1 |
| %i5 = integer_literal $Builtin.Int64, 27 |
| cond_br %c1, bb1(%i5 : $Builtin.Int64), bb5 |
| |
| bb2: |
| %f1 = function_ref @get_int1 : $@convention(thin) () -> Builtin.Int64 |
| %i1 = apply %f1() : $@convention(thin) () -> Builtin.Int64 |
| br bb4(%i1 : $Builtin.Int64) |
| |
| bb3: |
| %f2 = function_ref @get_int1 : $@convention(thin) () -> Builtin.Int64 |
| %i2 = apply %f2() : $@convention(thin) () -> Builtin.Int64 |
| br bb4(%i2 : $Builtin.Int64) |
| |
| // Jump threading must not be done for this block because the argument %i3 is also |
| // used in bb1. |
| bb4(%i3 : $Builtin.Int64): |
| br bb1(%i3 : $Builtin.Int64) |
| |
| bb5: |
| %r1 = tuple () |
| return %r1 : $() |
| |
| } |
| |
| sil @get_int1 : $@convention(thin) () -> Builtin.Int64 |
| sil @get_int2 : $@convention(thin) () -> Builtin.Int64 |
| sil @get_condition : $@convention(thin) (Builtin.Int64) -> Builtin.Int1 |