[PATCH] D63686: [LFTR] Fix post-inc pointer IV with truncated exit count (PR41998)

Dimitry Andric via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 23 14:23:12 PDT 2019


dim added a comment.

FWIW, the original test case with pre-increment is fixed by this, e.g.:

  #include <stdio.h>
  
  __attribute__((__noinline__)) void parse_pre(const char *dataptr) {
    int col;
    char line[1024];
    char *lineptr;
  
    for (col = 0, lineptr = line; *dataptr != '\0'; dataptr++) {
      printf("before inner loop: col=%d, diff=%td\n", col, lineptr - line);
      do {
        printf("inside inner loop: col=%d, diff=%td\n", col, lineptr - line);
        *++lineptr = ' ';
        col++;
      } while (col & 7);
    }
  }
  
  int main(void) {
    parse_pre("a");
  
    return 0;
  }

now runs the correct number of loops:

  $ ./ps-pdf-pre-r364133-D63686
  before inner loop: col=0, diff=0
  inside inner loop: col=0, diff=0
  inside inner loop: col=1, diff=1
  inside inner loop: col=2, diff=2
  inside inner loop: col=3, diff=3
  inside inner loop: col=4, diff=4
  inside inner loop: col=5, diff=5
  inside inner loop: col=6, diff=6
  inside inner loop: col=7, diff=7

The IR difference is this:

  @@ -54,7 +54,7 @@ do.body:                                          ; pr
     %9 = load i8*, i8** %lineptr, align 8, !tbaa !2
     %incdec.ptr = getelementptr inbounds i8, i8* %9, i32 1
     store i8* %incdec.ptr, i8** %lineptr, align 8, !tbaa !2
  -  store i8 32, i8* %9, align 1, !tbaa !8
  +  store i8 32, i8* %incdec.ptr, align 1, !tbaa !8
     %10 = load i32, i32* %col, align 4, !tbaa !6
     %inc = add nsw i32 %10, 1
     store i32 %inc, i32* %col, align 4, !tbaa !6


Repository:
  rL LLVM

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

https://reviews.llvm.org/D63686





More information about the llvm-commits mailing list