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
36 lines
1.1 KiB
LLVM
36 lines
1.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -codegenprepare -S -mtriple=x86_64-linux < %s | FileCheck %s
|
|
|
|
define i32 @test1(i8* %d) nounwind {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[L:%.*]] = load i8, i8* [[D:%.*]], align 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[L]], 0
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[IF_END:%.*]]
|
|
; CHECK: if.end:
|
|
; CHECK-NEXT: br label [[EXIT]]
|
|
; CHECK: exit:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i8 [[L]], 0
|
|
; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[TMP0]] to i32
|
|
; CHECK-NEXT: ret i32 [[CONV]]
|
|
;
|
|
entry:
|
|
%l = load i8, i8* %d
|
|
%cmp = icmp eq i8 %l, 0
|
|
br i1 %cmp, label %exit, label %if.end
|
|
|
|
if.end:
|
|
%gep = getelementptr i8, i8* %d, i32 42
|
|
%call = call i64 @foo(i8* %gep) nounwind readonly willreturn
|
|
%cmp2 = icmp ne i64 %call, 0
|
|
call void @llvm.assume(i1 %cmp2)
|
|
br label %exit
|
|
|
|
exit:
|
|
%conv = zext i1 %cmp to i32
|
|
ret i32 %conv
|
|
}
|
|
|
|
declare i64 @foo(i8*) nounwind readonly willreturn
|
|
declare void @llvm.assume(i1 noundef) nounwind willreturn
|