57 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -passes=ipsccp < %s | FileCheck %s3@g = external global i84 5define internal noundef i32 @ret_noundef() {6; CHECK-LABEL: define internal i32 @ret_noundef() {7; CHECK-NEXT: ret i32 poison8;9 ret i32 010}11 12define internal dereferenceable(1) ptr @ret_dereferenceable() {13; CHECK-LABEL: define internal ptr @ret_dereferenceable() {14; CHECK-NEXT: ret ptr poison15;16 ret ptr @g17}18 19define internal dereferenceable_or_null(1) ptr @ret_dereferenceable_or_null() {20; CHECK-LABEL: define internal ptr @ret_dereferenceable_or_null() {21; CHECK-NEXT: ret ptr poison22;23 ret ptr @g24}25 26; Non-null is fine, because it does not cause immediate UB.27define internal nonnull ptr @ret_nonnull() {28; CHECK-LABEL: define internal nonnull ptr @ret_nonnull() {29; CHECK-NEXT: ret ptr poison30;31 ret ptr @g32}33 34define internal nonnull ptr @ret_nonnull_noundef() {35; CHECK-LABEL: define internal nonnull ptr @ret_nonnull_noundef() {36; CHECK-NEXT: ret ptr poison37;38 ret ptr @g39}40 41define void @test() {42; CHECK-LABEL: define void @test() {43; CHECK-NEXT: [[TMP1:%.*]] = call i32 @ret_noundef()44; CHECK-NEXT: [[TMP2:%.*]] = call ptr @ret_dereferenceable()45; CHECK-NEXT: [[TMP3:%.*]] = call ptr @ret_dereferenceable_or_null()46; CHECK-NEXT: [[TMP4:%.*]] = call nonnull ptr @ret_nonnull()47; CHECK-NEXT: [[TMP5:%.*]] = call nonnull ptr @ret_nonnull_noundef()48; CHECK-NEXT: ret void49;50 call noundef i32 @ret_noundef()51 call dereferenceable(1) ptr @ret_dereferenceable()52 call dereferenceable_or_null(1) ptr @ret_dereferenceable_or_null()53 call nonnull ptr @ret_nonnull()54 call nonnull noundef ptr @ret_nonnull_noundef()55 ret void56}57