underlying-objects-1.ll 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. ; RUN: opt -basicaa -loop-accesses -analyze < %s | FileCheck %s
  2. ; In:
  3. ;
  4. ; store_ptr = A;
  5. ; load_ptr = &A[2];
  6. ; for (i = 0; i < n; i++)
  7. ; *store_ptr++ = *load_ptr++ *10; // A[i] = A[i+2] * 10
  8. ;
  9. ; make sure, we look through the PHI to conclude that store_ptr and load_ptr
  10. ; both have A as their underlying object. The dependence is safe for
  11. ; vectorization requiring no memchecks.
  12. ;
  13. ; Otherwise we would try to prove independence with a memcheck that is going
  14. ; to always fail.
  15. target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
  16. target triple = "x86_64-apple-macosx10.10.0"
  17. ; CHECK: Memory dependences are safe{{$}}
  18. define void @f(i8* noalias %A, i64 %width) {
  19. for.body.preheader:
  20. %A_ahead = getelementptr inbounds i8, i8* %A, i64 2
  21. br label %for.body
  22. for.body:
  23. %i = phi i64 [ %i.1, %for.body ], [ 0, %for.body.preheader ]
  24. %load_ptr = phi i8* [ %load_ptr.1, %for.body ], [ %A_ahead, %for.body.preheader ]
  25. %store_ptr = phi i8* [ %store_ptr.1, %for.body ], [ %A, %for.body.preheader ]
  26. %loadA = load i8, i8* %load_ptr, align 1
  27. %mul = mul i8 %loadA, 10
  28. store i8 %mul, i8* %store_ptr, align 1
  29. %load_ptr.1 = getelementptr inbounds i8, i8* %load_ptr, i64 1
  30. %store_ptr.1 = getelementptr inbounds i8, i8* %store_ptr, i64 1
  31. %i.1 = add nuw i64 %i, 1
  32. %exitcond = icmp eq i64 %i.1, %width
  33. br i1 %exitcond, label %for.end, label %for.body
  34. for.end:
  35. ret void
  36. }