164 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s3 4typedef double * __attribute__((align_value(64))) aligned_double;5 6// CHECK-LABEL: @_Z3fooPdS_Rd(7// CHECK-NEXT: entry:8// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 89// CHECK-NEXT: [[Y_ADDR:%.*]] = alloca ptr, align 810// CHECK-NEXT: [[Z_ADDR:%.*]] = alloca ptr, align 811// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 812// CHECK-NEXT: store ptr [[Y:%.*]], ptr [[Y_ADDR]], align 813// CHECK-NEXT: store ptr [[Z:%.*]], ptr [[Z_ADDR]], align 814// CHECK-NEXT: ret void15//16void foo(aligned_double x, double * y __attribute__((align_value(32))),17 double & z __attribute__((align_value(128)))) { };18 19struct ad_struct {20 aligned_double a;21};22 23// CHECK-LABEL: @_Z3fooR9ad_struct(24// CHECK-NEXT: entry:25// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 826// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 827// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 828// CHECK-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_AD_STRUCT:%.*]], ptr [[TMP0]], i32 0, i32 029// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A]], align 830// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP1]], i64 64) ]31// CHECK-NEXT: ret ptr [[TMP1]]32//33double *foo(ad_struct& x) {34 35 return x.a;36}37 38// CHECK-LABEL: @_Z3gooP9ad_struct(39// CHECK-NEXT: entry:40// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 841// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 842// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 843// CHECK-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_AD_STRUCT:%.*]], ptr [[TMP0]], i32 0, i32 044// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A]], align 845// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP1]], i64 64) ]46// CHECK-NEXT: ret ptr [[TMP1]]47//48double *goo(ad_struct *x) {49 50 return x->a;51}52 53// CHECK-LABEL: @_Z3barPPd(54// CHECK-NEXT: entry:55// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 856// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 857// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 858// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 859// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP1]], i64 64) ]60// CHECK-NEXT: ret ptr [[TMP1]]61//62double *bar(aligned_double *x) {63 64 return *x;65}66 67// CHECK-LABEL: @_Z3carRPd(68// CHECK-NEXT: entry:69// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 870// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 871// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 872// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 873// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP1]], i64 64) ]74// CHECK-NEXT: ret ptr [[TMP1]]75//76double *car(aligned_double &x) {77 78 return x;79}80 81// CHECK-LABEL: @_Z3darPPd(82// CHECK-NEXT: entry:83// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 884// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 885// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 886// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[TMP0]], i64 587// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[ARRAYIDX]], align 888// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP1]], i64 64) ]89// CHECK-NEXT: ret ptr [[TMP1]]90//91double *dar(aligned_double *x) {92 93 return x[5];94}95 96aligned_double eep();97// CHECK-LABEL: @_Z3retv(98// CHECK-NEXT: entry:99// CHECK-NEXT: [[CALL:%.*]] = call noundef ptr @_Z3eepv()100// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[CALL]], i64 64) ]101// CHECK-NEXT: ret ptr [[CALL]]102//103double *ret() {104 105 return eep();106}107 108// CHECK-LABEL: @_Z3no1PPd(109// CHECK-NEXT: entry:110// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8111// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 8112// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8113// CHECK-NEXT: ret ptr [[TMP0]]114//115double **no1(aligned_double *x) {116 return x;117}118 119// CHECK-LABEL: @_Z3no2RPd(120// CHECK-NEXT: entry:121// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8122// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 8123// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8124// CHECK-NEXT: ret ptr [[TMP0]]125//126double *&no2(aligned_double &x) {127 return x;128}129 130// CHECK-LABEL: @_Z3no3RPd(131// CHECK-NEXT: entry:132// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8133// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 8134// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8135// CHECK-NEXT: ret ptr [[TMP0]]136//137double **no3(aligned_double &x) {138 return &x;139}140 141// CHECK-LABEL: @_Z3no3Pd(142// CHECK-NEXT: entry:143// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8144// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 8145// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8146// CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8147// CHECK-NEXT: ret double [[TMP1]]148//149double no3(aligned_double x) {150 return *x;151}152 153// CHECK-LABEL: @_Z3no4Pd(154// CHECK-NEXT: entry:155// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8156// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR]], align 8157// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8158// CHECK-NEXT: ret ptr [[TMP0]]159//160double *no4(aligned_double x) {161 return x;162}163 164