builtin-bit-cast.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // RUN: %clang_cc1 -std=c++2a -S -emit-llvm -o - -disable-llvm-passes -triple x86_64-apple-macos10.14 %s | FileCheck %s
  2. void test_scalar(int &oper) {
  3. // CHECK-LABEL: define void @_Z11test_scalarRi
  4. __builtin_bit_cast(float, oper);
  5. // CHECK: [[OPER:%.*]] = alloca i32*
  6. // CHECK: [[REF:%.*]] = load i32*, i32**
  7. // CHECK-NEXT: [[CASTED:%.*]] = bitcast i32* [[REF]] to float*
  8. // CHECK-NEXT: load float, float* [[CASTED]]
  9. }
  10. struct two_ints {
  11. int x;
  12. int y;
  13. };
  14. unsigned long test_aggregate_to_scalar(two_ints &ti) {
  15. // CHECK-LABEL: define i64 @_Z24test_aggregate_to_scalarR8two_ints
  16. return __builtin_bit_cast(unsigned long, ti);
  17. // CHECK: [[TI_ADDR:%.*]] = alloca %struct.two_ints*, align 8
  18. // CHECK: [[TI_LOAD:%.*]] = load %struct.two_ints*, %struct.two_ints** [[TI_ADDR]]
  19. // CHECK-NEXT: [[CASTED:%.*]] = bitcast %struct.two_ints* [[TI_LOAD]] to i64*
  20. // CHECK-NEXT: load i64, i64* [[CASTED]]
  21. }
  22. struct two_floats {
  23. float x;
  24. float y;
  25. };
  26. two_floats test_aggregate_record(two_ints& ti) {
  27. // CHECK-LABEL: define <2 x float> @_Z21test_aggregate_recordR8two_int
  28. return __builtin_bit_cast(two_floats, ti);
  29. // CHECK: [[RETVAL:%.*]] = alloca %struct.two_floats, align 4
  30. // CHECK: [[TI:%.*]] = alloca %struct.two_ints*, align 8
  31. // CHECK: [[LOAD_TI:%.*]] = load %struct.two_ints*, %struct.two_ints** [[TI]]
  32. // CHECK: [[MEMCPY_SRC:%.*]] = bitcast %struct.two_ints* [[LOAD_TI]] to i8*
  33. // CHECK: [[MEMCPY_DST:%.*]] = bitcast %struct.two_floats* [[RETVAL]] to i8*
  34. // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[MEMCPY_DST]], i8* align 4 [[MEMCPY_SRC]]
  35. }
  36. two_floats test_aggregate_array(int (&ary)[2]) {
  37. // CHECK-LABEL: define <2 x float> @_Z20test_aggregate_arrayRA2_i
  38. return __builtin_bit_cast(two_floats, ary);
  39. // CHECK: [[RETVAL:%.*]] = alloca %struct.two_floats, align 4
  40. // CHECK: [[ARY:%.*]] = alloca [2 x i32]*, align 8
  41. // CHECK: [[LOAD_ARY:%.*]] = load [2 x i32]*, [2 x i32]** [[ARY]]
  42. // CHECK: [[MEMCPY_SRC:%.*]] = bitcast [2 x i32]* [[LOAD_ARY]] to i8*
  43. // CHECK: [[MEMCPY_DST:%.*]] = bitcast %struct.two_floats* [[RETVAL]] to i8*
  44. // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[MEMCPY_DST]], i8* align 4 [[MEMCPY_SRC]]
  45. }
  46. two_ints test_scalar_to_aggregate(unsigned long ul) {
  47. // CHECK-LABEL: define i64 @_Z24test_scalar_to_aggregatem
  48. return __builtin_bit_cast(two_ints, ul);
  49. // CHECK: [[TI:%.*]] = alloca %struct.two_ints, align 4
  50. // CHECK: [[TITMP:%.*]] = bitcast %struct.two_ints* [[TI]] to i8*
  51. // CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[TITMP]]
  52. }
  53. unsigned long test_complex(_Complex unsigned &cu) {
  54. // CHECK-LABEL: define i64 @_Z12test_complexRCj
  55. return __builtin_bit_cast(unsigned long, cu);
  56. // CHECK: [[REF_ALLOCA:%.*]] = alloca { i32, i32 }*, align 8
  57. // CHECK-NEXT: store { i32, i32 }* {{.*}}, { i32, i32 }** [[REF_ALLOCA]]
  58. // CHECK-NEXT: [[REF:%.*]] = load { i32, i32 }*, { i32, i32 }** [[REF_ALLOCA]]
  59. // CHECK-NEXT: [[CASTED:%.*]] = bitcast { i32, i32 }* [[REF]] to i64*
  60. // CHECK-NEXT: load i64, i64* [[CASTED]], align 4
  61. }
  62. _Complex unsigned test_to_complex(unsigned long &ul) {
  63. // CHECK-LABEL: define i64 @_Z15test_to_complexRm
  64. return __builtin_bit_cast(_Complex unsigned, ul);
  65. // CHECK: [[REF:%.*]] = alloca i64*
  66. // CHECK: [[LOAD_REF:%.*]] = load i64*, i64** [[REF]]
  67. // CHECK: [[CASTED:%.*]] = bitcast i64* [[LOAD_REF]] to { i32, i32 }*
  68. }
  69. unsigned long test_array(int (&ary)[2]) {
  70. // CHECK-LABEL: define i64 @_Z10test_arrayRA2_i
  71. return __builtin_bit_cast(unsigned long, ary);
  72. // CHECK: [[REF_ALLOCA:%.*]] = alloca [2 x i32]*
  73. // CHECK: [[LOAD_REF:%.*]] = load [2 x i32]*, [2 x i32]** [[REF_ALLOCA]]
  74. // CHECK: [[CASTED:%.*]] = bitcast [2 x i32]* [[LOAD_REF]] to i64*
  75. // CHECK: load i64, i64* [[CASTED]], align 4
  76. }
  77. two_ints test_rvalue_aggregate() {
  78. // CHECK-LABEL: define i64 @_Z21test_rvalue_aggregate
  79. return __builtin_bit_cast(two_ints, 42ul);
  80. // CHECK: [[TI:%.*]] = alloca %struct.two_ints, align 4
  81. // CHECK: [[CASTED:%.*]] = bitcast %struct.two_ints* [[TI]] to i8*
  82. // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[CASTED]]
  83. }