[llvm-dev] <no subject>

liren peng via llvm-dev llvm-dev at lists.llvm.org
Wed Sep 15 03:42:11 PDT 2021


Hi, ALL

  I have something unclear about  calling memset for array storage, the case is showing as below.

 

// cat test.c

void foo(int *p);

void test (int len)  { 

  int a[7];

  for (int i = 0; i < len; i++) a[i] = 0;

  foo(a); 

}

 

; Function Attrs: nounwind

define  void @test(i32 signext %len) {

entry:

  %a = alloca [7 x i32], align 4

  %0 = bitcast [7 x i32]* %a to i8*

  %cmp4 = icmp sgt i32 %len, 0

 

for.body.preheader:                               ; preds = %entry

  %1 = zext i32 %len to i64

  %2 = shl nuw nsw i64 %1, 2

  call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %0, i8 0, i64 %2, i1 false)

  br label %for.cond.cleanup

 

for.cond.cleanup:                                 ; preds = %for.body.preheader, %entry

  %arraydecay = getelementptr inbounds [7 x i32], [7 x i32]* %a, i64 0, i64 0

  call void @foo(i32* nonnull %arraydecay) #4

  ret void

}

 

There are two issues:

1.ScalarEvolution could not get the exact loop max trip count , but such loop only allowed to run 7 times.

2.We know that LoopIdiomRecognize pass will transform this Loop into a libcall of memset, and llvm.memset won’t be expand because of SIZE of memory space( %2) is unknown.

But if function test is a HOT SPOT,  calling  memset in libc is unwise.

 

In summary, I wrote a patch to infer loop max trip count from array access in loop, and disabled

Loop Idiom while loop trip count is small enough,  and also we can enable Loop Idiom regardless of loop trip count  by passing  “-use-lir-loop-max-tripcount=0” in command line.

We can discuss the overall idea in this thread.

For the implementation details, please comment on this patch : https://reviews.llvm.org/D109821

Thank you all.

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210915/5c7abed3/attachment.html>


More information about the llvm-dev mailing list