blob: 71e5db6f5cf8039c4c29dc18adb3cdd53b3bb677 [file] [log] [blame]
JF Bastienc6dabb92013-07-18 06:11:45 +00001// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2
3// Validate that volatile _Complex loads and stores are generated
4// properly, including their alignment (even when overaligned).
5//
6// This test assumes that floats are 32-bit aligned and doubles are
7// 64-bit aligned, and uses x86-64 as a target that should have this
8// datalayout.
9
10// CHECK: target datalayout = "{{.*}}f32:32:32-f64:64:64{{.*}}"
JF Bastienab96e562013-07-17 05:57:42 +000011
12volatile _Complex float cf;
13volatile _Complex double cd;
14volatile _Complex float cf32 __attribute__((aligned(32)));
15volatile _Complex double cd32 __attribute__((aligned(32)));
16
Stephen Lin93ab6bf2013-08-15 06:47:53 +000017// CHECK-LABEL-LABEL: define void @test_cf()
JF Bastienab96e562013-07-17 05:57:42 +000018void test_cf() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000019 // CHECK: load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 0), align 4
JF Bastienab96e562013-07-17 05:57:42 +000020 // CHECK-NEXT: load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 1), align 4
21 (void)(cf);
22 // CHECK-NEXT: [[R:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 0), align 4
23 // CHECK-NEXT: [[I:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 1), align 4
24 // CHECK-NEXT: store volatile float [[R]], float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 0), align 4
25 // CHECK-NEXT: store volatile float [[I]], float* getelementptr inbounds ({ float, float }* @cf, i32 0, i32 1), align 4
26 (void)(cf=cf);
27 // CHECK-NEXT: ret void
28}
29
Stephen Lin93ab6bf2013-08-15 06:47:53 +000030// CHECK-LABEL-LABEL: define void @test_cd()
JF Bastienab96e562013-07-17 05:57:42 +000031void test_cd() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000032 // CHECK: load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 0), align 8
JF Bastienab96e562013-07-17 05:57:42 +000033 // CHECK-NEXT: load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 1), align 8
34 (void)(cd);
35 // CHECK-NEXT: [[R:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 0), align 8
36 // CHECK-NEXT: [[I:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 1), align 8
37 // CHECK-NEXT: store volatile double [[R]], double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 0), align 8
38 // CHECK-NEXT: store volatile double [[I]], double* getelementptr inbounds ({ double, double }* @cd, i32 0, i32 1), align 8
39 (void)(cd=cd);
40 // CHECK-NEXT: ret void
41}
42
Stephen Lin93ab6bf2013-08-15 06:47:53 +000043// CHECK-LABEL-LABEL: define void @test_cf32()
JF Bastienab96e562013-07-17 05:57:42 +000044void test_cf32() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000045 // CHECK: load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 0), align 32
JF Bastienab96e562013-07-17 05:57:42 +000046 // CHECK-NEXT: load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 1), align 4
47 (void)(cf32);
48 // CHECK-NEXT: [[R:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 0), align 32
49 // CHECK-NEXT: [[I:%.*]] = load volatile float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 1), align 4
50 // CHECK-NEXT: store volatile float [[R]], float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 0), align 32
51 // CHECK-NEXT: store volatile float [[I]], float* getelementptr inbounds ({ float, float }* @cf32, i32 0, i32 1), align 4
52 (void)(cf32=cf32);
53 // CHECK-NEXT: ret void
54}
55
Stephen Lin93ab6bf2013-08-15 06:47:53 +000056// CHECK-LABEL-LABEL: define void @test_cd32()
JF Bastienab96e562013-07-17 05:57:42 +000057void test_cd32() {
NAKAMURA Takumiac13d612013-07-17 06:39:40 +000058 // CHECK: load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 0), align 32
JF Bastienab96e562013-07-17 05:57:42 +000059 // CHECK-NEXT: load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 1), align 8
60 (void)(cd32);
61 // CHECK-NEXT: [[R:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 0), align 32
62 // CHECK-NEXT: [[I:%.*]] = load volatile double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 1), align 8
63 // CHECK-NEXT: store volatile double [[R]], double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 0), align 32
64 // CHECK-NEXT: store volatile double [[I]], double* getelementptr inbounds ({ double, double }* @cd32, i32 0, i32 1), align 8
65 (void)(cd32=cd32);
66 // CHECK-NEXT: ret void
67}