vec_phi_extract.ll 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. define void @f(i64 %val, i32 %limit, i32 *%ptr) {
  3. ;CHECK: %0 = trunc i64
  4. ;CHECK: %1 = phi i32
  5. entry:
  6. %tempvector = insertelement <16 x i64> undef, i64 %val, i32 0
  7. %vector = shufflevector <16 x i64> %tempvector, <16 x i64> undef, <16 x i32> zeroinitializer
  8. %0 = add <16 x i64> %vector, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
  9. %1 = trunc <16 x i64> %0 to <16 x i32>
  10. br label %loop
  11. loop:
  12. %2 = phi <16 x i32> [ %1, %entry ], [ %inc, %loop ]
  13. %elt = extractelement <16 x i32> %2, i32 0
  14. %end = icmp ult i32 %elt, %limit
  15. %3 = add i32 10, %elt
  16. %4 = sext i32 %elt to i64
  17. %5 = getelementptr i32, i32* %ptr, i64 %4
  18. store i32 %3, i32* %5
  19. %inc = add <16 x i32> %2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
  20. br i1 %end, label %loop, label %ret
  21. ret:
  22. ret void
  23. }
  24. define i1 @g(<3 x i32> %input_2) {
  25. ; CHECK: extractelement
  26. entry:
  27. br label %for.cond
  28. for.cond:
  29. ; CHECK: phi i32
  30. %input_2.addr.0 = phi <3 x i32> [ %input_2, %entry ], [ %div45, %for.body ]
  31. %input_1.addr.1 = phi <3 x i32> [ undef, %entry ], [ %dec43, %for.body ]
  32. br i1 undef, label %for.end, label %for.body
  33. ; CHECK: extractelement
  34. for.body:
  35. %dec43 = add <3 x i32> %input_1.addr.1, <i32 -1, i32 -1, i32 -1>
  36. %sub44 = sub <3 x i32> <i32 -1, i32 -1, i32 -1>, %dec43
  37. %div45 = sdiv <3 x i32> %input_2.addr.0, %sub44
  38. br label %for.cond
  39. for.end:
  40. %0 = extractelement <3 x i32> %input_2.addr.0, i32 0
  41. %.89 = select i1 false, i32 0, i32 %0
  42. %tobool313 = icmp eq i32 %.89, 0
  43. ret i1 %tobool313
  44. }