add-with-overflow.ll 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. ; RUN: llvm-as < %s | llc -march=x86 | grep {jo} | count 2
  2. ; RUN: llvm-as < %s | llc -march=x86 | grep {jb} | count 2
  3. ; RUN: llvm-as < %s | llc -march=x86 -fast | grep {jo} | count 2
  4. ; RUN: llvm-as < %s | llc -march=x86 -fast | grep {jb} | count 2
  5. @ok = internal constant [4 x i8] c"%d\0A\00"
  6. @no = internal constant [4 x i8] c"no\0A\00"
  7. define i1 @func1(i32 %v1, i32 %v2) nounwind {
  8. entry:
  9. %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
  10. %sum = extractvalue {i32, i1} %t, 0
  11. %obit = extractvalue {i32, i1} %t, 1
  12. br i1 %obit, label %overflow, label %normal
  13. normal:
  14. %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
  15. ret i1 true
  16. overflow:
  17. %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @no, i32 0, i32 0) ) nounwind
  18. ret i1 false
  19. }
  20. define i1 @func2(i32 %v1, i32 %v2) nounwind {
  21. entry:
  22. %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
  23. %sum = extractvalue {i32, i1} %t, 0
  24. %obit = extractvalue {i32, i1} %t, 1
  25. br i1 %obit, label %carry, label %normal
  26. normal:
  27. %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
  28. ret i1 true
  29. carry:
  30. %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @no, i32 0, i32 0) ) nounwind
  31. ret i1 false
  32. }
  33. define i1 @func3() nounwind {
  34. entry:
  35. %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 0, i32 0)
  36. %sum = extractvalue {i32, i1} %t, 0
  37. %obit = extractvalue {i32, i1} %t, 1
  38. br i1 %obit, label %carry, label %normal
  39. normal:
  40. %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
  41. ret i1 true
  42. carry:
  43. %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @no, i32 0, i32 0) ) nounwind
  44. ret i1 false
  45. }
  46. define i1 @func4() nounwind {
  47. entry:
  48. %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 0, i32 0)
  49. %sum = extractvalue {i32, i1} %t, 0
  50. %obit = extractvalue {i32, i1} %t, 1
  51. br i1 %obit, label %carry, label %normal
  52. normal:
  53. %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
  54. ret i1 true
  55. carry:
  56. %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @no, i32 0, i32 0) ) nounwind
  57. ret i1 false
  58. }
  59. declare i32 @printf(i8*, ...) nounwind
  60. declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32)
  61. declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32)