218 lines · c
1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fms-extensions -emit-llvm < %s | FileCheck %s2 3// -------------4// Scalar integer5// -------------6__unaligned int x;7void test1(void) {8 // CHECK: {{%.*}} = load i32, ptr @x, align 19 // CHECK: store i32 {{%.*}}, ptr @x, align 110 x++;11}12 13void test2(void) {14 // CHECK: %y = alloca i32, align 115 // CHECK: {{%.*}} = load i32, ptr %y, align 116 // CHECK: store i32 {{%.*}}, ptr %y, align 117 __unaligned int y;18 y++;19}20 21void test2_1(void) {22 // CHECK: %y = alloca i32, align 123 // CHECK: store i32 1, ptr %y, align 124 __unaligned int y = 1;25}26 27// -------------28// Global pointer29// -------------30int *__unaligned p1;31void test3(void) {32 33 // CHECK: {{%.*}} = load ptr, ptr @p1, align 134 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 435 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 436 (*p1)++;37}38 39int __unaligned *p2;40void test4(void) {41 // CHECK: {{%.*}} = load ptr, ptr @p2, align 842 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 143 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 144 (*p2)++;45}46 47int __unaligned *__unaligned p3;48void test5(void) {49 // CHECK: {{%.*}} = load ptr, ptr @p3, align 150 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 151 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 152 (*p3)++;53}54 55// -------------56// Local pointer57// -------------58void test6(void) {59 // CHECK: %lp1 = alloca ptr, align 160 // CHECK: {{%.*}} = load ptr, ptr %lp1, align 161 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 462 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 463 int *__unaligned lp1;64 (*lp1)++;65}66 67void test7(void) {68 // CHECK: %lp2 = alloca ptr, align 869 // CHECK: {{%.*}} = load ptr, ptr %lp2, align 870 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 171 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 172 int __unaligned *lp2;73 (*lp2)++;74}75 76void test8(void) {77 // CHECK: %lp3 = alloca ptr, align 178 // CHECK: {{%.*}} = load ptr, ptr %lp3, align 179 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 180 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 181 int __unaligned *__unaligned lp3;82 (*lp3)++;83}84 85// -------------86// Global array87// -------------88__unaligned int a[10];89void test9(void) {90 // CHECK: {{%.*}} = load i32, ptr getelementptr inbounds ([10 x i32], ptr @a, i64 0, i64 3), align 191 // CHECK: store i32 {{%.*}}, ptr getelementptr inbounds ([10 x i32], ptr @a, i64 0, i64 3), align 192 (a[3])++;93}94 95// -------------96// Local array97// -------------98void test10(void) {99 // CHECK: %la = alloca [10 x i32], align 1100 // CHECK: {{%.*}} = getelementptr inbounds [10 x i32], ptr %la, i64 0, i64 3101 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1102 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1103 __unaligned int la[10];104 (la[3])++;105}106 107// --------108// Typedefs109// --------110 111typedef __unaligned int UnalignedInt;112void test13(void) {113 // CHECK: %i = alloca i32, align 1114 // CHECK: {{%.*}} = load i32, ptr %i, align 1115 // CHECK: store i32 {{%.*}}, ptr %i, align 1116 UnalignedInt i;117 i++;118}119 120typedef int Aligned;121typedef __unaligned Aligned UnalignedInt2;122void test14(void) {123 // CHECK: %i = alloca i32, align 1124 // CHECK: {{%.*}} = load i32, ptr %i, align 1125 // CHECK: store i32 {{%.*}}, ptr %i, align 1126 UnalignedInt2 i;127 i++;128}129 130typedef UnalignedInt UnalignedInt3;131void test15(void) {132 // CHECK: %i = alloca i32, align 1133 // CHECK: {{%.*}} = load i32, ptr %i, align 1134 // CHECK: store i32 {{%.*}}, ptr %i, align 1135 UnalignedInt3 i;136 i++;137}138 139// -------------140// Decayed types141// -------------142void test16(__unaligned int c[10]) {143 // CHECK: {{%.*}} = alloca ptr, align 8144 // CHECK: store ptr %c, ptr {{%.*}}, align 8145 // CHECK: {{%.*}} = load ptr, ptr {{%.*}}, align 8146 // CHECK: {{%.*}} = getelementptr inbounds i32, ptr {{%.*}}, i64 3147 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1148 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1149 c[3]++;150}151 152// -----------153// __alignof__154// -----------155int test17(void) {156 // CHECK: ret i32 1157 return __alignof__(__unaligned int);158}159 160int test18(void) {161 // CHECK: ret i32 1162 __unaligned int a;163 return __alignof__(a);164}165 166int test19(void) {167 // CHECK: ret i32 1168 __unaligned int a[10];169 return __alignof__(a);170}171 172// -----------173// structs174// -----------175typedef176struct S1 {177 char c;178 int x;179} S1;180 181__unaligned S1 s1;182void test20(void) {183 // CHECK: {{%.*}} = load i32, ptr getelementptr inbounds nuw (%struct.S1, ptr @s1, i32 0, i32 1), align 1184 // CHECK: store i32 {{%.*}}, ptr getelementptr inbounds nuw (%struct.S1, ptr @s1, i32 0, i32 1), align 1185 s1.x++;186}187 188void test21(void) {189 // CHECK: {{%.*}} = alloca %struct.S1, align 1190 // CHECK: {{%.*}} = getelementptr inbounds nuw %struct.S1, ptr {{%.*}}, i32 0, i32 1191 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1192 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1193 __unaligned S1 s1_2;194 s1_2.x++;195}196 197typedef198struct __attribute__((packed)) S2 {199 char c;200 int x;201} S2;202 203__unaligned S2 s2;204void test22(void) {205 // CHECK: {{%.*}} = load i32, ptr getelementptr inbounds nuw (%struct.S2, ptr @s2, i32 0, i32 1), align 1206 // CHECK: store i32 {{%.*}}, ptr getelementptr inbounds nuw (%struct.S2, ptr @s2, i32 0, i32 1), align 1207 s2.x++;208}209 210void test23(void) {211 // CHECK: {{%.*}} = alloca %struct.S2, align 1212 // CHECK: {{%.*}} = getelementptr inbounds nuw %struct.S2, ptr {{%.*}}, i32 0, i32 1213 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1214 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1215 __unaligned S2 s2_2;216 s2_2.x++;217}218