gep.ll 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. ; RUN: opt -S -instsimplify < %s | FileCheck %s
  2. target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
  3. %struct.A = type { [7 x i8] }
  4. define %struct.A* @test1(%struct.A* %b, %struct.A* %e) {
  5. %e_ptr = ptrtoint %struct.A* %e to i64
  6. %b_ptr = ptrtoint %struct.A* %b to i64
  7. %sub = sub i64 %e_ptr, %b_ptr
  8. %sdiv = sdiv exact i64 %sub, 7
  9. %gep = getelementptr inbounds %struct.A, %struct.A* %b, i64 %sdiv
  10. ret %struct.A* %gep
  11. ; CHECK-LABEL: @test1
  12. ; CHECK-NEXT: ret %struct.A* %e
  13. }
  14. define i8* @test2(i8* %b, i8* %e) {
  15. %e_ptr = ptrtoint i8* %e to i64
  16. %b_ptr = ptrtoint i8* %b to i64
  17. %sub = sub i64 %e_ptr, %b_ptr
  18. %gep = getelementptr inbounds i8, i8* %b, i64 %sub
  19. ret i8* %gep
  20. ; CHECK-LABEL: @test2
  21. ; CHECK-NEXT: ret i8* %e
  22. }
  23. define i64* @test3(i64* %b, i64* %e) {
  24. %e_ptr = ptrtoint i64* %e to i64
  25. %b_ptr = ptrtoint i64* %b to i64
  26. %sub = sub i64 %e_ptr, %b_ptr
  27. %ashr = ashr exact i64 %sub, 3
  28. %gep = getelementptr inbounds i64, i64* %b, i64 %ashr
  29. ret i64* %gep
  30. ; CHECK-LABEL: @test3
  31. ; CHECK-NEXT: ret i64* %e
  32. }
  33. define %struct.A* @test4(%struct.A* %b) {
  34. %b_ptr = ptrtoint %struct.A* %b to i64
  35. %sub = sub i64 0, %b_ptr
  36. %sdiv = sdiv exact i64 %sub, 7
  37. %gep = getelementptr inbounds %struct.A, %struct.A* %b, i64 %sdiv
  38. ret %struct.A* %gep
  39. ; CHECK-LABEL: @test4
  40. ; CHECK-NEXT: ret %struct.A* null
  41. }
  42. define i8* @test5(i8* %b) {
  43. %b_ptr = ptrtoint i8* %b to i64
  44. %sub = sub i64 0, %b_ptr
  45. %gep = getelementptr inbounds i8, i8* %b, i64 %sub
  46. ret i8* %gep
  47. ; CHECK-LABEL: @test5
  48. ; CHECK-NEXT: ret i8* null
  49. }
  50. define i64* @test6(i64* %b) {
  51. %b_ptr = ptrtoint i64* %b to i64
  52. %sub = sub i64 0, %b_ptr
  53. %ashr = ashr exact i64 %sub, 3
  54. %gep = getelementptr inbounds i64, i64* %b, i64 %ashr
  55. ret i64* %gep
  56. ; CHECK-LABEL: @test6
  57. ; CHECK-NEXT: ret i64* null
  58. }
  59. define i8* @test7(i8* %b, i8** %e) {
  60. %e_ptr = ptrtoint i8** %e to i64
  61. %b_ptr = ptrtoint i8* %b to i64
  62. %sub = sub i64 %e_ptr, %b_ptr
  63. %gep = getelementptr inbounds i8, i8* %b, i64 %sub
  64. ret i8* %gep
  65. ; CHECK-LABEL: @test7
  66. ; CHECK-NEXT: ptrtoint
  67. ; CHECK-NEXT: ptrtoint
  68. ; CHECK-NEXT: sub
  69. ; CHECK-NEXT: getelementptr
  70. ; CHECK-NEXT: ret
  71. }