backward-dep-different-types.ll 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. ; RUN: opt -loop-accesses -analyze < %s | FileCheck %s
  2. ; In this loop just because we access A through different types (int, float)
  3. ; we still have a dependence cycle:
  4. ;
  5. ; for (i = 0; i < n; i++) {
  6. ; A_float = (float *) A;
  7. ; A_float[i + 1] = A[i] * B[i];
  8. ; }
  9. target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
  10. target triple = "x86_64-apple-macosx10.10.0"
  11. ; CHECK: Report: unsafe dependent memory operations in loop
  12. ; CHECK-NOT: Memory dependences are safe
  13. @B = common global i32* null, align 8
  14. @A = common global i32* null, align 8
  15. define void @f() {
  16. entry:
  17. %a = load i32*, i32** @A, align 8
  18. %b = load i32*, i32** @B, align 8
  19. br label %for.body
  20. for.body: ; preds = %for.body, %entry
  21. %storemerge3 = phi i64 [ 0, %entry ], [ %add, %for.body ]
  22. %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %storemerge3
  23. %loadA = load i32, i32* %arrayidxA, align 2
  24. %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %storemerge3
  25. %loadB = load i32, i32* %arrayidxB, align 2
  26. %mul = mul i32 %loadB, %loadA
  27. %add = add nuw nsw i64 %storemerge3, 1
  28. %a_float = bitcast i32* %a to float*
  29. %arrayidxA_plus_2 = getelementptr inbounds float, float* %a_float, i64 %add
  30. %mul_float = sitofp i32 %mul to float
  31. store float %mul_float, float* %arrayidxA_plus_2, align 2
  32. %exitcond = icmp eq i64 %add, 20
  33. br i1 %exitcond, label %for.end, label %for.body
  34. for.end: ; preds = %for.body
  35. ret void
  36. }