
This patch deduces `noundef` attributes for return values. IIUC, a function returns `noundef` values iff all of its return values are guaranteed not to be `undef` or `poison`. Definition of `noundef` from LangRef: ``` noundef This attribute applies to parameters and return values. If the value representation contains any undefined or poison bits, the behavior is undefined. Note that this does not refer to padding introduced by the type’s storage representation. ``` Alive2: https://alive2.llvm.org/ce/z/g8Eis6 Compile-time impact: http://llvm-compile-time-tracker.com/compare.php?from=30dcc33c4ea3ab50397a7adbe85fe977d4a400bd&to=c5e8738d4bfbf1e97e3f455fded90b791f223d74&stat=instructions:u |stage1-O3|stage1-ReleaseThinLTO|stage1-ReleaseLTO-g|stage1-O0-g|stage2-O3|stage2-O0-g|stage2-clang| |--|--|--|--|--|--|--| |+0.01%|+0.01%|-0.01%|+0.01%|+0.03%|-0.04%|+0.01%| The motivation of this patch is to reduce the number of `freeze` insts and enable more optimizations.
23 lines
546 B
LLVM
23 lines
546 B
LLVM
; RUN: opt -abort-on-max-devirt-iterations-reached -passes='cgscc(devirt<1>(inline,instcombine))' -S < %s | FileCheck %s
|
|
; RUN: opt -abort-on-max-devirt-iterations-reached -passes='default<O2>' -S < %s | FileCheck %s
|
|
|
|
define i32 @i() alwaysinline {
|
|
ret i32 45
|
|
}
|
|
|
|
; CHECK-LABEL: define {{(noundef )?}}i32 @main
|
|
; CHECK-NEXT: ret i32 45
|
|
|
|
define i32 @main() {
|
|
%a = alloca ptr
|
|
store ptr @i, ptr %a
|
|
%r = call i32 @call(ptr %a)
|
|
ret i32 %r
|
|
}
|
|
|
|
define i32 @call(ptr %a) alwaysinline {
|
|
%c = load ptr, ptr %a
|
|
%r = call i32 %c()
|
|
ret i32 %r
|
|
}
|