2012-06-06-LoadOfPHIs.ll 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. ; <rdar://problem/10889741>
  3. define void @func(double %r, double %g, double %b, double* %outH, double* %outS, double* %outL) nounwind uwtable ssp {
  4. bb:
  5. %tmp = alloca double, align 8
  6. %tmp1 = alloca double, align 8
  7. %tmp2 = alloca double, align 8
  8. store double %r, double* %tmp, align 8
  9. store double %g, double* %tmp1, align 8
  10. store double %b, double* %tmp2, align 8
  11. %tmp3 = fcmp ogt double %r, %g
  12. br i1 %tmp3, label %bb4, label %bb8
  13. bb4: ; preds = %bb
  14. %tmp5 = fcmp ogt double %r, %b
  15. br i1 %tmp5, label %bb6, label %bb7
  16. bb6: ; preds = %bb4
  17. br label %bb12
  18. bb7: ; preds = %bb4
  19. br label %bb12
  20. bb8: ; preds = %bb
  21. %tmp9 = fcmp ogt double %g, %b
  22. br i1 %tmp9, label %bb10, label %bb11
  23. bb10: ; preds = %bb8
  24. br label %bb12
  25. bb11: ; preds = %bb8
  26. br label %bb12
  27. bb12: ; preds = %bb11, %bb10, %bb7, %bb6
  28. %max.0 = phi double* [ %tmp, %bb6 ], [ %tmp2, %bb7 ], [ %tmp1, %bb10 ], [ %tmp2, %bb11 ]
  29. ; CHECK: %tmp13 = load double, double* %tmp, align 8
  30. ; CHECK: %tmp14 = load double, double* %tmp1, align 8
  31. ; CHECK: %tmp15 = fcmp olt double %tmp13, %tmp14
  32. %tmp13 = load double, double* %tmp, align 8
  33. %tmp14 = load double, double* %tmp1, align 8
  34. %tmp15 = fcmp olt double %tmp13, %tmp14
  35. br i1 %tmp15, label %bb16, label %bb21
  36. bb16: ; preds = %bb12
  37. %tmp17 = load double, double* %tmp2, align 8
  38. %tmp18 = fcmp olt double %tmp13, %tmp17
  39. br i1 %tmp18, label %bb19, label %bb20
  40. bb19: ; preds = %bb16
  41. br label %bb26
  42. bb20: ; preds = %bb16
  43. br label %bb26
  44. bb21: ; preds = %bb12
  45. %tmp22 = load double, double* %tmp2, align 8
  46. %tmp23 = fcmp olt double %tmp14, %tmp22
  47. br i1 %tmp23, label %bb24, label %bb25
  48. bb24: ; preds = %bb21
  49. br label %bb26
  50. bb25: ; preds = %bb21
  51. br label %bb26
  52. bb26: ; preds = %bb25, %bb24, %bb20, %bb19
  53. %min.0 = phi double* [ %tmp, %bb19 ], [ %tmp2, %bb20 ], [ %tmp1, %bb24 ], [ %tmp2, %bb25 ]
  54. ; CHECK: %tmp27 = load double, double* %min.0, align 8
  55. ; CHECK: %tmp28 = load double, double* %max.0
  56. ; CHECK: %tmp29 = fadd double %tmp27, %tmp28
  57. %tmp27 = load double, double* %min.0, align 8
  58. %tmp28 = load double, double* %max.0
  59. %tmp29 = fadd double %tmp27, %tmp28
  60. %tmp30 = fdiv double %tmp29, 2.000000e+00
  61. store double %tmp30, double* %outL
  62. %tmp31 = load double, double* %min.0
  63. %tmp32 = load double, double* %max.0
  64. %tmp33 = fcmp oeq double %tmp31, %tmp32
  65. br i1 %tmp33, label %bb34, label %bb35
  66. bb34: ; preds = %bb26
  67. store double 0.000000e+00, double* %outS
  68. store double 0.000000e+00, double* %outH
  69. br label %bb81
  70. bb35: ; preds = %bb26
  71. %tmp36 = fcmp olt double %tmp30, 5.000000e-01
  72. %tmp37 = fsub double %tmp32, %tmp31
  73. br i1 %tmp36, label %bb38, label %bb41
  74. bb38: ; preds = %bb35
  75. %tmp39 = fadd double %tmp32, %tmp31
  76. %tmp40 = fdiv double %tmp37, %tmp39
  77. store double %tmp40, double* %outS
  78. br label %bb45
  79. bb41: ; preds = %bb35
  80. %tmp42 = fsub double 2.000000e+00, %tmp32
  81. %tmp43 = fsub double %tmp42, %tmp31
  82. %tmp44 = fdiv double %tmp37, %tmp43
  83. store double %tmp44, double* %outS
  84. br label %bb45
  85. bb45: ; preds = %bb41, %bb38
  86. %tmp46 = icmp eq double* %max.0, %tmp
  87. br i1 %tmp46, label %bb47, label %bb55
  88. bb47: ; preds = %bb45
  89. %tmp48 = load double, double* %tmp1, align 8
  90. %tmp49 = load double, double* %tmp2, align 8
  91. %tmp50 = fsub double %tmp48, %tmp49
  92. %tmp51 = load double, double* %max.0
  93. %tmp52 = load double, double* %min.0
  94. %tmp53 = fsub double %tmp51, %tmp52
  95. %tmp54 = fdiv double %tmp50, %tmp53
  96. store double %tmp54, double* %outH
  97. br label %bb75
  98. bb55: ; preds = %bb45
  99. %tmp56 = icmp eq double* %max.0, %tmp1
  100. br i1 %tmp56, label %bb57, label %bb66
  101. bb57: ; preds = %bb55
  102. %tmp58 = load double, double* %tmp2, align 8
  103. %tmp59 = load double, double* %tmp, align 8
  104. %tmp60 = fsub double %tmp58, %tmp59
  105. %tmp61 = load double, double* %max.0
  106. %tmp62 = load double, double* %min.0
  107. %tmp63 = fsub double %tmp61, %tmp62
  108. %tmp64 = fdiv double %tmp60, %tmp63
  109. %tmp65 = fadd double 2.000000e+00, %tmp64
  110. store double %tmp65, double* %outH
  111. br label %bb75
  112. bb66: ; preds = %bb55
  113. %tmp67 = load double, double* %tmp, align 8
  114. %tmp68 = load double, double* %tmp1, align 8
  115. %tmp69 = fsub double %tmp67, %tmp68
  116. %tmp70 = load double, double* %max.0
  117. %tmp71 = load double, double* %min.0
  118. %tmp72 = fsub double %tmp70, %tmp71
  119. %tmp73 = fdiv double %tmp69, %tmp72
  120. %tmp74 = fadd double 4.000000e+00, %tmp73
  121. store double %tmp74, double* %outH
  122. br label %bb75
  123. bb75: ; preds = %bb66, %bb57, %bb47
  124. %tmp76 = load double, double* %outH
  125. %tmp77 = fdiv double %tmp76, 6.000000e+00
  126. store double %tmp77, double* %outH
  127. %tmp78 = fcmp olt double %tmp77, 0.000000e+00
  128. br i1 %tmp78, label %bb79, label %bb81
  129. bb79: ; preds = %bb75
  130. %tmp80 = fadd double %tmp77, 1.000000e+00
  131. store double %tmp80, double* %outH
  132. br label %bb81
  133. bb81: ; preds = %bb79, %bb75, %bb34
  134. ret void
  135. }