Guest User

Untitled

a guest
Apr 20th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. Index: test/Transforms/InstCombine/intrinsics.ll
  2. ===================================================================
  3. --- test/Transforms/InstCombine/intrinsics.ll (revision 90007)
  4. +++ test/Transforms/InstCombine/intrinsics.ll (working copy)
  5. @@ -1,12 +1,79 @@
  6. ; RUN: opt %s -instcombine -S | FileCheck %s
  7.  
  8. -declare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8)
  9. +%overflow.result = type {i8, i1}
  10.  
  11. +declare %overflow.result @llvm.uadd.with.overflow.i8(i8, i8)
  12. +declare %overflow.result @llvm.umul.with.overflow.i8(i8, i8)
  13. +
  14. define i8 @test1(i8 %A, i8 %B) {
  15. - %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
  16. - %y = extractvalue {i8, i1} %x, 0
  17. + %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
  18. + %y = extractvalue %overflow.result %x, 0
  19. ret i8 %y
  20. ; CHECK: @test1
  21. ; CHECK-NEXT: %y = add i8 %A, %B
  22. ; CHECK-NEXT: ret i8 %y
  23. }
  24. +
  25. +define i8 @test2(i8 %A, i8 %B, i1* %overflowPtr) {
  26. + %and.A = and i8 %A, 127
  27. + %and.B = and i8 %B, 127
  28. + %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %and.A, i8 %and.B)
  29. + %y = extractvalue %overflow.result %x, 0
  30. + %z = extractvalue %overflow.result %x, 1
  31. + store i1 %z, i1* %overflowPtr
  32. + ret i8 %y
  33. +; CHECK: @test2
  34. +; CHECK-NEXT: %and.A = and i8 %A, 127
  35. +; CHECK-NEXT: %and.B = and i8 %B, 127
  36. +; CHECK-NEXT: %1 = add nuw i8 %and.A, %and.B
  37. +; CHECK-NEXT: store i1 false, i1* %overflowPtr
  38. +; CHECK-NEXT: ret i8 %1
  39. +}
  40. +
  41. +define i8 @test3(i8 %A, i8 %B, i1* %overflowPtr) {
  42. + %or.A = or i8 %A, -128
  43. + %or.B = or i8 %B, -128
  44. + %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %or.A, i8 %or.B)
  45. + %y = extractvalue %overflow.result %x, 0
  46. + %z = extractvalue %overflow.result %x, 1
  47. + store i1 %z, i1* %overflowPtr
  48. + ret i8 %y
  49. +; CHECK: @test3
  50. +; CHECK-NEXT: %or.A = or i8 %A, -128
  51. +; CHECK-NEXT: %or.B = or i8 %B, -128
  52. +; CHECK-NEXT: %1 = add i8 %or.A, %or.B
  53. +; CHECK-NEXT: store i1 true, i1* %overflowPtr
  54. +; CHECK-NEXT: ret i8 %1
  55. +}
  56. +
  57. +define i8 @test4(i8 %A, i1* %overflowPtr) {
  58. + %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 undef, i8 %A)
  59. + %y = extractvalue %overflow.result %x, 0
  60. + %z = extractvalue %overflow.result %x, 1
  61. + store i1 %z, i1* %overflowPtr
  62. + ret i8 %y
  63. +; CHECK: @test4
  64. +; CHECK-NEXT: ret i8 undef
  65. +}
  66. +
  67. +define i8 @test5(i8 %A, i1* %overflowPtr) {
  68. + %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 0, i8 %A)
  69. + %y = extractvalue %overflow.result %x, 0
  70. + %z = extractvalue %overflow.result %x, 1
  71. + store i1 %z, i1* %overflowPtr
  72. + ret i8 %y
  73. +; CHECK: @test5
  74. +; CHECK-NEXT: store i1 false, i1* %overflowPtr
  75. +; CHECK-NEXT: ret i8 0
  76. +}
  77. +
  78. +define i8 @test6(i8 %A, i1* %overflowPtr) {
  79. + %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 1, i8 %A)
  80. + %y = extractvalue %overflow.result %x, 0
  81. + %z = extractvalue %overflow.result %x, 1
  82. + store i1 %z, i1* %overflowPtr
  83. + ret i8 %y
  84. +; CHECK: @test6
  85. +; CHECK-NEXT: store i1 false, i1* %overflowPtr
  86. +; CHECK-NEXT: ret i8 %A
  87. +}
Add Comment
Please, Sign In to add comment