[PATCH] D53342: [SimplifyLibCalls] Mark known arguments with nonnull

Dávid Bolvanský via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 19 06:29:13 PDT 2019


xbolva00 marked an inline comment as done.
xbolva00 added inline comments.


================
Comment at: lib/Transforms/Utils/SimplifyLibCalls.cpp:1149
+    removeNonNull(CI, {0});
+    // FIXME: InstCombine infinite loops :( Only when isIntrinsic == true
+  }
----------------
xbolva00 wrote:
> xbolva00 wrote:
> > @spatel @jdoerfert @lebedev.ri infinite loop here
> > 
> > https://github.com/llvm/llvm-project/blob/master/llvm/test/Transforms/InstCombine/memset-1.ll#L63
> > If I add return CI; -> memset is removed:
> > 
> > 
> > define float* @pr25892(i32 %size) #0 {
> > ; CHECK-LABEL: @pr25892(
> > ; CHECK-NEXT:  entry:
> > ; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @malloc(i32 [[SIZE:%.*]]) #0
> > ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8* [[CALL]], null
> > ; CHECK-NEXT:    br i1 [[CMP]], label [[CLEANUP:%.*]], label [[IF_END:%.*]]
> > ; CHECK:       if.end:
> > ; CHECK-NEXT:    [[BC:%.*]] = bitcast i8* [[CALL]] to float*
> > ; CHECK-NEXT:    br label [[CLEANUP]]
> > ; CHECK:       cleanup:
> > ; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi float* [ [[BC]], [[IF_END]] ], [ null, [[ENTRY:%.*]] ]
> > ; CHECK-NEXT:    ret float* [[RETVAL_0]]
> > ;
> > 
> > 
> > Maybe you can give me a hint what is wrong? Thanks
> Anyway, we dont need to drop removeNonNull(CI, {0}); for llvm.memset.
> 
> It is only issue for libc's memset, and we catch it, e.g:
> 
> if (LenC && LenC->getZExtValue() > 0) {
>     annotateDereferenceableBytes(CI, {0}, LenC->getZExtValue());
>     annotateNonNull(CI, {0});
>   } else if (!isIntrinsic) {
>      removeNonNull(CI, {0});
> }
> 
> But I would like to know what is going here :)
And maybe we can (after this patch) propose to annotate llvm.memset/memcpy/memmove with nonnull in td file? @jdoerfert 

With -OO no opts run -> no problem even with nonnull attrs.
-O1 and higher:
InstCombine drops nonnull attrs when nonconstant size and then converts them to intrinsics -> seems fine and safe for me.




CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D53342/new/

https://reviews.llvm.org/D53342





More information about the llvm-commits mailing list