mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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.
296 lines
10 KiB
Plaintext
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
|
|
}
|
|
|