memcpy_chk-1.ll 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. ; Test lib call simplification of __memcpy_chk calls with various values
  2. ; for dstlen and len.
  3. ;
  4. ; RUN: opt < %s -instcombine -S | FileCheck %s
  5. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
  6. %struct.T1 = type { [100 x i32], [100 x i32], [1024 x i8] }
  7. %struct.T2 = type { [100 x i32], [100 x i32], [1024 x i8] }
  8. %struct.T3 = type { [100 x i32], [100 x i32], [2048 x i8] }
  9. @t1 = common global %struct.T1 zeroinitializer
  10. @t2 = common global %struct.T2 zeroinitializer
  11. @t3 = common global %struct.T3 zeroinitializer
  12. ; Check cases where dstlen >= len.
  13. define i8* @test_simplify1() {
  14. ; CHECK-LABEL: @test_simplify1(
  15. %dst = bitcast %struct.T1* @t1 to i8*
  16. %src = bitcast %struct.T2* @t2 to i8*
  17. ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1824, i32 4, i1 false)
  18. ; CHECK-NEXT: ret i8* bitcast (%struct.T1* @t1 to i8*)
  19. %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 1824)
  20. ret i8* %ret
  21. }
  22. define i8* @test_simplify2() {
  23. ; CHECK-LABEL: @test_simplify2(
  24. %dst = bitcast %struct.T1* @t1 to i8*
  25. %src = bitcast %struct.T3* @t3 to i8*
  26. ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T3* @t3 to i8*), i64 1824, i32 4, i1 false)
  27. ; CHECK-NEXT: ret i8* bitcast (%struct.T1* @t1 to i8*)
  28. %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 2848)
  29. ret i8* %ret
  30. }
  31. ; Check cases where dstlen < len.
  32. define i8* @test_no_simplify1() {
  33. ; CHECK-LABEL: @test_no_simplify1(
  34. %dst = bitcast %struct.T3* @t3 to i8*
  35. %src = bitcast %struct.T1* @t1 to i8*
  36. ; CHECK-NEXT: %ret = call i8* @__memcpy_chk(i8* bitcast (%struct.T3* @t3 to i8*), i8* bitcast (%struct.T1* @t1 to i8*), i64 2848, i64 1824)
  37. ; CHECK-NEXT: ret i8* %ret
  38. %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 2848, i64 1824)
  39. ret i8* %ret
  40. }
  41. define i8* @test_no_simplify2() {
  42. ; CHECK-LABEL: @test_no_simplify2(
  43. %dst = bitcast %struct.T1* @t1 to i8*
  44. %src = bitcast %struct.T2* @t2 to i8*
  45. ; CHECK-NEXT: %ret = call i8* @__memcpy_chk(i8* bitcast (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1024, i64 0)
  46. ; CHECK-NEXT: ret i8* %ret
  47. %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1024, i64 0)
  48. ret i8* %ret
  49. }
  50. define i8* @test_simplify_return_indcall(i8* ()* %alloc) {
  51. ; CHECK-LABEL: @test_simplify_return_indcall(
  52. %src = bitcast %struct.T2* @t2 to i8*
  53. ; CHECK-NEXT: %dst = call i8* %alloc()
  54. %dst = call i8* %alloc()
  55. ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64
  56. %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 1824)
  57. ; CHECK-NEXT: ret i8* %dst
  58. ret i8* %ret
  59. }
  60. declare i8* @__memcpy_chk(i8*, i8*, i64, i64)