[llvm-dev] [ScalarEvolution] Infer loop max trip count from array accesses

liren peng via llvm-dev llvm-dev at lists.llvm.org
Sat Sep 25 23:34:23 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

}

 

For such a case, I want to get the exact loop upper bound, but now there is no API to help. So I post a patch about to infer loop bound from array accesses. And a modified patch was posted after some review comments.

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

Any comment are precious to me, thank you all.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210926/20237c30/attachment.html>


More information about the llvm-dev mailing list