blob: 5fdc7692341df70b50a0f3dd390dcfe7554e2662 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -redundant-phi-elimination | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
class X {}
// CHECK-LABEL: sil @test_simple
// CHECK: bb1:
// CHECK: br bb3(%0 : $Builtin.Int64)
// CHECK: bb2:
// CHECK: br bb3(%1 : $Builtin.Int64)
// CHECK: bb3([[ARG:%[0-9]+]] : $Builtin.Int64):
// CHECK: builtin "sadd_with_overflow_Int64"([[ARG]] : $Builtin.Int64, [[ARG]] : $Builtin.Int64,
// CHECK: } // end sil function 'test_simple'
sil @test_simple : $@convention(thin) () -> () {
bb0:
%0 = integer_literal $Builtin.Int64, 0
%1 = integer_literal $Builtin.Int64, 1
%2 = integer_literal $Builtin.Int1, -1
cond_br undef, bb1, bb2
bb1:
br bb3(%0 : $Builtin.Int64, %0 : $Builtin.Int64)
bb2:
br bb3(%1 : $Builtin.Int64, %1 : $Builtin.Int64)
bb3(%4 : $Builtin.Int64, %5 : $Builtin.Int64):
%6 = builtin "sadd_with_overflow_Int64"(%4 : $Builtin.Int64, %5 : $Builtin.Int64, %2 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
%8 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 1
cond_fail %8 : $Builtin.Int1, "arithmetic overflow"
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @test_not_equal
// CHECK: bb1:
// CHECK: br bb3(%0 : $Builtin.Int64, %0 : $Builtin.Int64)
// CHECK: bb2:
// CHECK: br bb3(%0 : $Builtin.Int64, %1 : $Builtin.Int64)
// CHECK: bb3([[ARG1:%[0-9]+]] : $Builtin.Int64, [[ARG2:%[0-9]+]] : $Builtin.Int64):
// CHECK: builtin "sadd_with_overflow_Int64"([[ARG1]] : $Builtin.Int64, [[ARG2]] : $Builtin.Int64,
// CHECK: } // end sil function 'test_not_equal'
sil @test_not_equal : $@convention(thin) () -> () {
bb0:
%0 = integer_literal $Builtin.Int64, 0
%1 = integer_literal $Builtin.Int64, 1
%2 = integer_literal $Builtin.Int1, -1
cond_br undef, bb1, bb2
bb1:
br bb3(%0 : $Builtin.Int64, %0 : $Builtin.Int64)
bb2:
br bb3(%0 : $Builtin.Int64, %1 : $Builtin.Int64)
bb3(%4 : $Builtin.Int64, %5 : $Builtin.Int64):
%6 = builtin "sadd_with_overflow_Int64"(%4 : $Builtin.Int64, %5 : $Builtin.Int64, %2 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
%8 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 1
cond_fail %8 : $Builtin.Int1, "arithmetic overflow"
%r = tuple ()
return %r : $()
}
sil @unknown : $@convention(thin) () -> Builtin.Int64
// CHECK-LABEL: sil @test_side_effects
// CHECK: [[A1:%[0-9]+]] = apply
// CHECK: [[A2:%[0-9]+]] = apply
// CHECK: br bb1([[A1]] : $Builtin.Int64, [[A2]] : $Builtin.Int64)
// CHECK: bb1([[ARG1:%[0-9]+]] : $Builtin.Int64, [[ARG2:%[0-9]+]] : $Builtin.Int64):
// CHECK: builtin "sadd_with_overflow_Int64"([[ARG1]] : $Builtin.Int64, [[ARG2]] : $Builtin.Int64,
// CHECK: } // end sil function 'test_side_effects'
sil @test_side_effects : $@convention(thin) () -> () {
bb0:
%f = function_ref @unknown : $@convention(thin) () -> Builtin.Int64
%0 = apply %f() : $@convention(thin) () -> Builtin.Int64
%1 = apply %f() : $@convention(thin) () -> Builtin.Int64
%2 = integer_literal $Builtin.Int1, -1
br bb1(%0 : $Builtin.Int64, %1 : $Builtin.Int64)
bb1(%4 : $Builtin.Int64, %5 : $Builtin.Int64):
%6 = builtin "sadd_with_overflow_Int64"(%4 : $Builtin.Int64, %5 : $Builtin.Int64, %2 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
%8 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 1
cond_fail %8 : $Builtin.Int1, "arithmetic overflow"
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @test_loop
// CHECK: br bb1(%0 : $Builtin.Int64)
// CHECK: bb1([[ARG:%[0-9]+]] : $Builtin.Int64):
// CHECK: [[S1:%[0-9]+]] = builtin "sadd_with_overflow_Int64"([[ARG]] : $Builtin.Int64,
// CHECK: [[T1:%[0-9]+]] = tuple_extract [[S1]] {{.*}}, 0
// CHECK: [[T2:%[0-9]+]] = tuple_extract [[S1]] {{.*}}, 1
// CHECK: cond_fail [[T2]]
// CHECK: [[S2:%[0-9]+]] = builtin "sadd_with_overflow_Int64"([[ARG]] : $Builtin.Int64,
// CHECK: [[T3:%[0-9]+]] = tuple_extract [[S2]] {{.*}}, 1
// CHECK: cond_fail [[T3]]
// CHECK: bb2:
// CHECK: br bb1([[T1]] : $Builtin.Int64)
// CHECK: } // end sil function 'test_loop'
sil @test_loop : $@convention(thin) () -> () {
bb0:
%0 = integer_literal $Builtin.Int64, 0
%1 = integer_literal $Builtin.Int64, 1
%2 = integer_literal $Builtin.Int1, -1
br bb1(%0 : $Builtin.Int64, %0 : $Builtin.Int64)
bb1(%4 : $Builtin.Int64, %5 : $Builtin.Int64):
%6 = builtin "sadd_with_overflow_Int64"(%4 : $Builtin.Int64, %1 : $Builtin.Int64, %2 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
%7 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 0
%8 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 1
cond_fail %8 : $Builtin.Int1, "arithmetic overflow"
%10 = builtin "sadd_with_overflow_Int64"(%5 : $Builtin.Int64, %1 : $Builtin.Int64, %2 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
%11 = tuple_extract %10 : $(Builtin.Int64, Builtin.Int1), 0
%12 = tuple_extract %10 : $(Builtin.Int64, Builtin.Int1), 1
cond_fail %12 : $Builtin.Int1, "arithmetic overflow"
cond_br undef, bb2, bb3
bb2:
br bb1(%7 : $Builtin.Int64, %11 : $Builtin.Int64)
bb3:
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @test_mismatching_arg
// CHECK: br bb1(%0 : $Builtin.Int64, %0 : $Builtin.Int64)
// CHECK: bb1([[ARG1:%[0-9]+]] : $Builtin.Int64, {{%[0-9]+}} : $Builtin.Int64):
// CHECK: bb2:
// CHECK: br bb1([[ARG1]] : $Builtin.Int64, %1 : $Builtin.Int64)
// CHECK: } // end sil function 'test_mismatching_arg'
sil @test_mismatching_arg : $@convention(thin) () -> () {
bb0:
%0 = integer_literal $Builtin.Int64, 0
%1 = integer_literal $Builtin.Int64, 1
br bb1(%0 : $Builtin.Int64, %0 : $Builtin.Int64)
bb1(%4 : $Builtin.Int64, %5 : $Builtin.Int64):
cond_br undef, bb2, bb3
bb2:
br bb1(%4 : $Builtin.Int64, %1 : $Builtin.Int64)
bb3:
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @test_allocation_inst
// CHECK: alloc_ref
// CHECK: alloc_ref
// CHECK: bb1([[ARG1:%[0-9]+]] : $X, [[ARG2:%[0-9]+]] : $X):
// CHECK: tuple ([[ARG1]] : $X, [[ARG2]] : $X)
// CHECK: } // end sil function 'test_allocation_inst'
sil @test_allocation_inst : $@convention(thin) () -> (X, X) {
bb0:
%1 = alloc_ref $X
%2 = alloc_ref $X
br bb1(%1 : $X, %2 : $X)
bb1(%3 : $X, %4 : $X):
%r = tuple (%3 : $X, %4 : $X)
return %r : $(X, X)
}