56 lines
1.6 KiB
LLVM
56 lines
1.6 KiB
LLVM
|
; RUN: opt -S -passes=ipsccp < %s | FileCheck %s
|
||
|
@g = external global i8
|
||
|
|
||
|
define internal noundef i32 @ret_noundef() {
|
||
|
; CHECK-LABEL: define internal i32 @ret_noundef() {
|
||
|
; CHECK-NEXT: ret i32 undef
|
||
|
;
|
||
|
ret i32 0
|
||
|
}
|
||
|
|
||
|
define internal dereferenceable(1) ptr @ret_dereferenceable() {
|
||
|
; CHECK-LABEL: define internal ptr @ret_dereferenceable() {
|
||
|
; CHECK-NEXT: ret ptr undef
|
||
|
;
|
||
|
ret ptr @g
|
||
|
}
|
||
|
|
||
|
define internal dereferenceable_or_null(1) ptr @ret_dereferenceable_or_null() {
|
||
|
; CHECK-LABEL: define internal ptr @ret_dereferenceable_or_null() {
|
||
|
; CHECK-NEXT: ret ptr undef
|
||
|
;
|
||
|
ret ptr @g
|
||
|
}
|
||
|
|
||
|
; Non-null is fine, because it does not cause immediate UB.
|
||
|
define internal nonnull ptr @ret_nonnull() {
|
||
|
; CHECK-LABEL: define internal nonnull ptr @ret_nonnull() {
|
||
|
; CHECK-NEXT: ret ptr undef
|
||
|
;
|
||
|
ret ptr @g
|
||
|
}
|
||
|
|
||
|
define internal nonnull ptr @ret_nonnull_noundef() {
|
||
|
; CHECK-LABEL: define internal nonnull ptr @ret_nonnull_noundef() {
|
||
|
; CHECK-NEXT: ret ptr undef
|
||
|
;
|
||
|
ret ptr @g
|
||
|
}
|
||
|
|
||
|
define void @test() {
|
||
|
; CHECK-LABEL: define void @test() {
|
||
|
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @ret_noundef()
|
||
|
; CHECK-NEXT: [[TMP2:%.*]] = call ptr @ret_dereferenceable()
|
||
|
; CHECK-NEXT: [[TMP3:%.*]] = call ptr @ret_dereferenceable_or_null()
|
||
|
; CHECK-NEXT: [[TMP4:%.*]] = call nonnull ptr @ret_nonnull()
|
||
|
; CHECK-NEXT: [[TMP5:%.*]] = call nonnull ptr @ret_nonnull_noundef()
|
||
|
; CHECK-NEXT: ret void
|
||
|
;
|
||
|
call noundef i32 @ret_noundef()
|
||
|
call dereferenceable(1) ptr @ret_dereferenceable()
|
||
|
call dereferenceable_or_null(1) ptr @ret_dereferenceable_or_null()
|
||
|
call nonnull ptr @ret_nonnull()
|
||
|
call nonnull noundef ptr @ret_nonnull_noundef()
|
||
|
ret void
|
||
|
}
|