File: builtin-bit-cast.cpp

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (95 lines) | stat: -rw-r--r-- 3,135 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// RUN: %clang_cc1 -std=c++2a -emit-llvm -o - -disable-llvm-passes -triple x86_64-apple-macos10.14 %s | FileCheck %s

void test_scalar(int &oper) {
  // CHECK-LABEL: define{{.*}} void @_Z11test_scalarRi
  __builtin_bit_cast(float, oper);

  // CHECK: [[OPER:%.*]] = alloca ptr
  // CHECK: [[REF:%.*]] = load ptr, ptr
  // CHECK-NEXT: load float, ptr [[REF]]
}

struct two_ints {
  int x;
  int y;
};

unsigned long test_aggregate_to_scalar(two_ints &ti) {
  // CHECK-LABEL: define{{.*}} i64 @_Z24test_aggregate_to_scalarR8two_ints
  return __builtin_bit_cast(unsigned long, ti);

  // CHECK: [[TI_ADDR:%.*]] = alloca ptr, align 8
  // CHECK: [[TI_LOAD:%.*]] = load ptr, ptr [[TI_ADDR]]
  // CHECK-NEXT: load i64, ptr [[TI_LOAD]]
}

struct two_floats {
  float x;
  float y;
};

two_floats test_aggregate_record(two_ints& ti) {
  // CHECK-LABEL: define{{.*}} <2 x float> @_Z21test_aggregate_recordR8two_int
   return __builtin_bit_cast(two_floats, ti);

  // CHECK: [[RETVAL:%.*]] = alloca %struct.two_floats, align 4
  // CHECK: [[TI:%.*]] = alloca ptr, align 8

  // CHECK: [[LOAD_TI:%.*]] = load ptr, ptr [[TI]]
  // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[RETVAL]], ptr align 4 [[LOAD_TI]]
}

two_floats test_aggregate_array(int (&ary)[2]) {
  // CHECK-LABEL: define{{.*}} <2 x float> @_Z20test_aggregate_arrayRA2_i
  return __builtin_bit_cast(two_floats, ary);

  // CHECK: [[RETVAL:%.*]] = alloca %struct.two_floats, align 4
  // CHECK: [[ARY:%.*]] = alloca ptr, align 8

  // CHECK: [[LOAD_ARY:%.*]] = load ptr, ptr [[ARY]]
  // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[RETVAL]], ptr align 4 [[LOAD_ARY]]
}

two_ints test_scalar_to_aggregate(unsigned long ul) {
  // CHECK-LABEL: define{{.*}} i64 @_Z24test_scalar_to_aggregatem
  return __builtin_bit_cast(two_ints, ul);

  // CHECK: [[TI:%.*]] = alloca %struct.two_ints, align 4
  // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TI]]
}

unsigned long test_complex(_Complex unsigned &cu) {
  // CHECK-LABEL: define{{.*}} i64 @_Z12test_complexRCj
  return __builtin_bit_cast(unsigned long, cu);

  // CHECK: [[REF_ALLOCA:%.*]] = alloca ptr, align 8
  // CHECK-NEXT: store ptr {{.*}}, ptr [[REF_ALLOCA]]
  // CHECK-NEXT: [[REF:%.*]] = load ptr, ptr [[REF_ALLOCA]]
  // CHECK-NEXT: load i64, ptr [[REF]], align 4
}

_Complex unsigned test_to_complex(unsigned long &ul) {
  // CHECK-LABEL: define{{.*}} i64 @_Z15test_to_complexRm

  return __builtin_bit_cast(_Complex unsigned, ul);

  // CHECK: [[REF:%.*]] = alloca ptr
  // CHECK: [[LOAD_REF:%.*]] = load ptr, ptr [[REF]]
}

unsigned long test_array(int (&ary)[2]) {
  // CHECK-LABEL: define{{.*}} i64 @_Z10test_arrayRA2_i
  return __builtin_bit_cast(unsigned long, ary);

  // CHECK: [[REF_ALLOCA:%.*]] = alloca ptr
  // CHECK: [[LOAD_REF:%.*]] = load ptr, ptr [[REF_ALLOCA]]
  // CHECK: load i64, ptr [[LOAD_REF]], align 4
}

two_ints test_rvalue_aggregate() {
  // CHECK-LABEL: define{{.*}} i64 @_Z21test_rvalue_aggregate
  return __builtin_bit_cast(two_ints, 42ul);

  // CHECK: [[TI:%.*]] = alloca %struct.two_ints, align 4
  // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TI]]
}