With the addition of the `willreturn` attribute, functions that may not return (e.g. due to an infinite loop) are well defined, if they are not marked as `willreturn`. This patch updates `wouldInstructionBeTriviallyDead` to not consider calls that may not return as dead. This patch still provides an escape hatch for intrinsics, which are still assumed as willreturn unconditionally. It will be removed once all intrinsics definitions have been reviewed and updated. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D94106
29 lines
905 B
LLVM
Executable File
29 lines
905 B
LLVM
Executable File
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -instsimplify -S -o /dev/null -debug-pass=Details -enable-new-pm=0 2>&1 | FileCheck --check-prefix DETAILS %s
|
|
; RUN: opt < %s -instsimplify -S -o - | FileCheck %s
|
|
|
|
; Verify that InstSimplifyLegacyPass notifies the pass manager about changes
|
|
; being made (when a call is removed CGSCC must be updated).
|
|
;
|
|
; DETAILS: Made Modification 'Remove redundant instructions' on Function 'main'
|
|
|
|
define internal void @func_1(i64* nocapture readnone %0) #0 {
|
|
; CHECK-LABEL: @func_1(
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
ret void
|
|
}
|
|
|
|
define i16 @main(i16 %0, i16** nocapture readnone %1) #1 {
|
|
; CHECK-LABEL: @main(
|
|
; CHECK-NEXT: bb1:
|
|
; CHECK-NEXT: unreachable
|
|
;
|
|
bb1:
|
|
call void @func_1(i64* undef)
|
|
unreachable
|
|
}
|
|
|
|
attributes #0 = { noinline norecurse nounwind readnone willreturn }
|
|
attributes #1 = { norecurse nounwind readnone }
|