blob: 1240aefb6a06e619960b9307b9995c9b9f564d83 [file] [log] [blame]
JF Bastienab96e562013-07-17 05:57:42 +00001// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
2
3volatile _Complex float cf;
4volatile _Complex double cd;
5volatile _Complex float cf32 __attribute__((aligned(32)));
6volatile _Complex double cd32 __attribute__((aligned(32)));
7
8
9// CHECK: define void @test_cf()
JF Bastienab96e562013-07-17 05:57:42 +000010void test_cf() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000011 // CHECK: load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 0), align 4
JF Bastienab96e562013-07-17 05:57:42 +000012 // CHECK-NEXT: load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 1), align 4
13 (void)(cf);
14 // CHECK-NEXT: [[R:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 0), align 4
15 // CHECK-NEXT: [[I:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 1), align 4
16 // CHECK-NEXT: store volatile float [[R]], float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 0), align 4
17 // CHECK-NEXT: store volatile float [[I]], float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 1), align 4
18 (void)(cf=cf);
19 // CHECK-NEXT: ret void
20}
21
22// CHECK: define void @test_cd()
JF Bastienab96e562013-07-17 05:57:42 +000023void test_cd() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000024 // CHECK: load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 0), align 8
JF Bastienab96e562013-07-17 05:57:42 +000025 // CHECK-NEXT: load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 1), align 8
26 (void)(cd);
27 // CHECK-NEXT: [[R:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 0), align 8
28 // CHECK-NEXT: [[I:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 1), align 8
29 // CHECK-NEXT: store volatile double [[R]], double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 0), align 8
30 // CHECK-NEXT: store volatile double [[I]], double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 1), align 8
31 (void)(cd=cd);
32 // CHECK-NEXT: ret void
33}
34
35// CHECK: define void @test_cf32()
JF Bastienab96e562013-07-17 05:57:42 +000036void test_cf32() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000037 // CHECK: load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 0), align 32
JF Bastienab96e562013-07-17 05:57:42 +000038 // CHECK-NEXT: load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 1), align 4
39 (void)(cf32);
40 // CHECK-NEXT: [[R:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 0), align 32
41 // CHECK-NEXT: [[I:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 1), align 4
42 // CHECK-NEXT: store volatile float [[R]], float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 0), align 32
43 // CHECK-NEXT: store volatile float [[I]], float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 1), align 4
44 (void)(cf32=cf32);
45 // CHECK-NEXT: ret void
46}
47
48// CHECK: define void @test_cd32()
JF Bastienab96e562013-07-17 05:57:42 +000049void test_cd32() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000050 // CHECK: load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 0), align 32
JF Bastienab96e562013-07-17 05:57:42 +000051 // CHECK-NEXT: load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 1), align 8
52 (void)(cd32);
53 // CHECK-NEXT: [[R:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 0), align 32
54 // CHECK-NEXT: [[I:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 1), align 8
55 // CHECK-NEXT: store volatile double [[R]], double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 0), align 32
56 // CHECK-NEXT: store volatile double [[I]], double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 1), align 8
57 (void)(cd32=cd32);
58 // CHECK-NEXT: ret void
59}