Files
swift-mirror/test/SIL/instruction_iteration.sil
Erik Eckstein 48db89031a SIL: be more tolerant when a user is deleted during use-list iteration.
Check if an operand's instruction has been deleted in `UseList.next()`.
This allows to delete an instruction, which has two uses of a value, during use-list iteration.
2025-03-07 15:59:32 +01:00

296 lines
10 KiB
Plaintext

// RUN: %empty-directory(%t)
// RUN: %target-sil-opt -sil-print-types %s -test-instruction-iteration -o %t/out.sil | %FileCheck --check-prefix=LOG %s
// RUN: %FileCheck %s < %t/out.sil
// Use this testfile to check if the `swift-frontend -sil-opt` option works.
// RUN: %swift_frontend_plain -sil-opt -sil-print-types %s -test-instruction-iteration -o %t/out.sil | %FileCheck --check-prefix=LOG %s
// RUN: %FileCheck %s < %t/out.sil
// REQUIRES: swift_in_compiler
sil_stage canonical
import Builtin
// LOG-LABEL: Test instruction iteration in delete_current_forward:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: %1 = string_literal utf8 "delete_strings"
// LOG-NEXT: %1 = integer_literal $Builtin.Int64, 3
// LOG-NEXT: return %0 : $()
// LOG-NEXT: End function delete_current_forward:
// CHECK-LABEL: sil @delete_current_forward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: %1 = integer_literal $Builtin.Int64, 3
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'delete_current_forward'
sil @delete_current_forward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = string_literal utf8 "delete_strings"
%2 = integer_literal $Builtin.Int64, 3
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in delete_next_forward:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: %1 = string_literal utf8 "delete_ints"
// LOG-NEXT: return %0 : $()
// LOG-NEXT: End function delete_next_forward:
// CHECK-LABEL: sil @delete_next_forward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: %1 = string_literal utf8 "delete_ints"
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'delete_next_forward'
sil @delete_next_forward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = string_literal utf8 "delete_ints"
%2 = integer_literal $Builtin.Int64, 3
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in delete_current_and_next_forward:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: %1 = string_literal utf8 "delete_strings"
// LOG-NEXT: return %0 : $()
// LOG-NEXT: End function delete_current_and_next_forward:
// CHECK-LABEL: sil @delete_current_and_next_forward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'delete_current_and_next_forward'
sil @delete_current_and_next_forward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = string_literal utf8 "delete_strings"
%2 = string_literal utf8 ""
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in delete_until_end_forward:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: %1 = string_literal utf8 "delete_branches"
// LOG-NEXT: %2 = string_literal utf8 "delete_strings"
// LOG-NEXT: bb1:
// LOG-NEXT: return %0 : $()
// LOG-NEXT: End function delete_until_end_forward:
// CHECK-LABEL: sil @delete_until_end_forward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: unreachable
// CHECK: } // end sil function 'delete_until_end_forward'
sil @delete_until_end_forward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = string_literal utf8 "delete_branches"
%2 = string_literal utf8 "delete_strings"
%3 = string_literal utf8 ""
%4 = string_literal utf8 ""
br bb1
bb1:
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in delete_current_backward:
// LOG-NEXT: bb0:
// LOG-NEXT: return %0 : $()
// LOG-NEXT: %2 = string_literal utf8 "delete_strings"
// LOG-NEXT: %1 = integer_literal $Builtin.Int64, 3
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: End function delete_current_backward:
// CHECK-LABEL: sil @delete_current_backward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: %1 = integer_literal $Builtin.Int64, 3
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'delete_current_backward'
sil @delete_current_backward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = integer_literal $Builtin.Int64, 3
%2 = string_literal utf8 "delete_strings"
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in delete_next_backward:
// LOG-NEXT: bb0:
// LOG-NEXT: return %0 : $()
// LOG-NEXT: %2 = string_literal utf8 "delete_ints"
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: End function delete_next_backward:
// CHECK-LABEL: sil @delete_next_backward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: %1 = string_literal utf8 "delete_ints"
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'delete_next_backward'
sil @delete_next_backward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = integer_literal $Builtin.Int64, 3
%2 = string_literal utf8 "delete_ints"
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in delete_current_and_next_backward:
// LOG-NEXT: bb0:
// LOG-NEXT: return %0 : $()
// LOG-NEXT: %2 = string_literal utf8 "delete_strings"
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: End function delete_current_and_next_backward:
// CHECK-LABEL: sil @delete_current_and_next_backward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'delete_current_and_next_backward'
sil @delete_current_and_next_backward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = string_literal utf8 ""
%2 = string_literal utf8 "delete_strings"
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in delete_until_end_backward:
// LOG-NEXT: bb0:
// LOG-NEXT: return %3 : $()
// LOG-NEXT: %3 = tuple ()
// LOG-NEXT: %2 = string_literal utf8 "delete_strings"
// LOG-NEXT: End function delete_until_end_backward:
// CHECK-LABEL: sil @delete_until_end_backward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'delete_until_end_backward'
sil @delete_until_end_backward : $@convention(thin) () -> () {
bb0:
%0 = string_literal utf8 ""
%1 = string_literal utf8 ""
%2 = string_literal utf8 "delete_strings"
%3 = tuple ()
return %3 : $()
}
// LOG-LABEL: Test instruction iteration in split_block_forward:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: %1 = string_literal utf8 "split_block"
// LOG-NEXT: %2 = integer_literal $Builtin.Int64, 3
// LOG-NEXT: return %0 : $()
// LOG-NEXT: End function split_block_forward:
// CHECK-LABEL: sil @split_block_forward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: unreachable
// CHECK: bb1:
// CHECK-NEXT: %2 = string_literal utf8 "split_block"
// CHECK-NEXT: %3 = integer_literal $Builtin.Int64, 3
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'split_block_forward'
sil @split_block_forward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = string_literal utf8 "split_block"
%2 = integer_literal $Builtin.Int64, 3
return %0 : $()
}
// LOG-LABEL: Test instruction iteration in split_block_backward:
// LOG-NEXT: bb0:
// LOG-NEXT: return %0 : $()
// LOG-NEXT: %2 = integer_literal $Builtin.Int64, 3
// LOG-NEXT: %1 = string_literal utf8 "split_block"
// LOG-NEXT: %0 = tuple ()
// LOG-NEXT: End function split_block_backward:
// CHECK-LABEL: sil @split_block_backward : $@convention(thin) () -> () {
// CHECK-NEXT: bb0:
// CHECK-NEXT: %0 = tuple ()
// CHECK-NEXT: unreachable
// CHECK: bb1:
// CHECK-NEXT: %2 = string_literal utf8 "split_block"
// CHECK-NEXT: %3 = integer_literal $Builtin.Int64, 3
// CHECK-NEXT: return %0 : $()
// CHECK-NEXT: } // end sil function 'split_block_backward'
sil @split_block_backward : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = string_literal utf8 "split_block"
%2 = integer_literal $Builtin.Int64, 3
return %0 : $()
}
sil @use1 : $@convention(thin) (Builtin.RawPointer) -> ()
sil @use2 : $@convention(thin) (Builtin.RawPointer, Builtin.RawPointer) -> ()
// LOG-LABEL: Test instruction iteration in print_uses:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = string_literal utf8 "print_uses"
// LOG-NEXT: use: operand #2 of %4 = apply %3(%0, %0)
// LOG-NEXT: use: operand #1 of %4 = apply %3(%0, %0)
// LOG-NEXT: use: operand #1 of %2 = apply %1(%0)
// LOG-NEXT: // function_ref use1
// LOG: End function print_uses:
sil @print_uses : $@convention(thin) () -> () {
bb0:
%0 = string_literal utf8 "print_uses"
%1 = function_ref @use1 : $@convention(thin) (Builtin.RawPointer) -> ()
%2 = apply %1(%0) : $@convention(thin) (Builtin.RawPointer) -> ()
%3 = function_ref @use2 : $@convention(thin) (Builtin.RawPointer, Builtin.RawPointer) -> ()
%4 = apply %3(%0, %0) : $@convention(thin) (Builtin.RawPointer, Builtin.RawPointer) -> ()
%5 = tuple ()
return %5
}
// LOG-LABEL: Test instruction iteration in delete_first_user:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = string_literal utf8 "delete_first_user"
// LOG-NEXT: use: operand #1 of %2 = apply %1(%0)
// LOG-NEXT: // function_ref use1
// LOG: End function delete_first_user:
sil @delete_first_user : $@convention(thin) () -> () {
bb0:
%0 = string_literal utf8 "delete_first_user"
%1 = function_ref @use1 : $@convention(thin) (Builtin.RawPointer) -> ()
%2 = apply %1(%0) : $@convention(thin) (Builtin.RawPointer) -> ()
%3 = function_ref @use2 : $@convention(thin) (Builtin.RawPointer, Builtin.RawPointer) -> ()
%4 = apply %3(%0, %0) : $@convention(thin) (Builtin.RawPointer, Builtin.RawPointer) -> ()
%5 = tuple ()
return %5
}
// LOG-LABEL: Test instruction iteration in delete_second_user:
// LOG-NEXT: bb0:
// LOG-NEXT: %0 = string_literal utf8 "delete_second_user"
// LOG-NEXT: use: operand #1 of %5 = apply %1(%0)
// LOG-NEXT: use: operand #1 of %2 = apply %1(%0)
// LOG-NEXT: // function_ref use1
// LOG: End function delete_second_user:
sil @delete_second_user : $@convention(thin) () -> () {
bb0:
%0 = string_literal utf8 "delete_second_user"
%1 = function_ref @use1 : $@convention(thin) (Builtin.RawPointer) -> ()
%2 = apply %1(%0) : $@convention(thin) (Builtin.RawPointer) -> ()
%3 = function_ref @use2 : $@convention(thin) (Builtin.RawPointer, Builtin.RawPointer) -> ()
%4 = apply %3(%0, %0) : $@convention(thin) (Builtin.RawPointer, Builtin.RawPointer) -> ()
%5 = apply %1(%0) : $@convention(thin) (Builtin.RawPointer) -> ()
%6 = tuple ()
return %6
}