From LangRef: > if the parameter or return pointer is null, poison value is > returned or passed instead. The nonnull attribute should be > combined with the noundef attribute to ensure a pointer is not > null or otherwise the behavior is undefined. Dropping noundef is sufficient to prevent UB. Including nonnull in this method just muddies the semantics.
50 lines
1.6 KiB
LLVM
50 lines
1.6 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
|
|
; RUN: opt -S -O3 -o - %s | FileCheck %s
|
|
|
|
; PR44154: LLVM c3b06d0c393e caused the body of @main to be replaced with
|
|
; unreachable. Check that we perform the expected calls and optimizations.
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
define i32 @main(i32 %argc, i8** %argv) #0 {
|
|
; CHECK-LABEL: define {{[^@]+}}@main
|
|
; CHECK-SAME: (i32 [[ARGC:%.*]], i8** nocapture readnone [[ARGV:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 [[ARGC]], 2
|
|
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP0]], i32 0, i32 [[ARGC]]
|
|
; CHECK-NEXT: ret i32 [[SPEC_SELECT]]
|
|
;
|
|
entry:
|
|
%0 = getelementptr inbounds i8*, i8** %argv, i32 0
|
|
%ptr = load i8*, i8** %0
|
|
%1 = call i32 @compute(i8* %ptr, i32 %argc)
|
|
%2 = icmp slt i32 %argc, 2
|
|
br i1 %2, label %done, label %do_work
|
|
|
|
do_work:
|
|
%3 = icmp eq i8* %ptr, null
|
|
br i1 %3, label %null, label %done
|
|
|
|
null:
|
|
call void @call_if_null(i8* %ptr)
|
|
br label %done
|
|
|
|
done:
|
|
%retval = phi i32 [0, %entry], [%1, %do_work], [%1, %null]
|
|
ret i32 %retval
|
|
}
|
|
|
|
define i32 @compute(i8* noundef nonnull %ptr, i32 %x) #1 {
|
|
; CHECK-LABEL: define {{[^@]+}}@compute
|
|
; CHECK-SAME: (i8* nocapture nonnull readnone [[PTR:%.*]], i32 returned [[X:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {
|
|
; CHECK-NEXT: ret i32 [[X]]
|
|
;
|
|
ret i32 %x
|
|
}
|
|
|
|
declare void @call_if_null(i8* %ptr) #0
|
|
|
|
attributes #0 = { nounwind }
|
|
attributes #1 = { noinline nounwind readonly }
|