Changeset View
Changeset View
Standalone View
Standalone View
clang/test/CodeGen/align_value.cpp
Context not available. | |||||
typedef double * __attribute__((align_value(64))) aligned_double; | typedef double * __attribute__((align_value(64))) aligned_double; | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3fooPdS_Rd | // CHECK-LABEL: @_Z3fooPdS_Rd( | ||||
// CHECK-SAME: (double* align 64 [[X:%.*]], double* align 32 [[Y:%.*]], double* nonnull align 128 dereferenceable(8) [[Z:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 | ||||
// CHECK-NEXT: [[Y_ADDR:%.*]] = alloca double*, align 8 | // CHECK-NEXT: [[Y_ADDR:%.*]] = alloca double*, align 8 | ||||
// CHECK-NEXT: [[Z_ADDR:%.*]] = alloca double*, align 8 | // CHECK-NEXT: [[Z_ADDR:%.*]] = alloca double*, align 8 | ||||
// CHECK-NEXT: store double* [[X]], double** [[X_ADDR]], align 8 | // CHECK-NEXT: store double* [[X:%.*]], double** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: store double* [[Y]], double** [[Y_ADDR]], align 8 | // CHECK-NEXT: store double* [[Y:%.*]], double** [[Y_ADDR]], align 8 | ||||
// CHECK-NEXT: store double* [[Z]], double** [[Z_ADDR]], align 8 | // CHECK-NEXT: store double* [[Z:%.*]], double** [[Z_ADDR]], align 8 | ||||
// CHECK-NEXT: ret void | // CHECK-NEXT: ret void | ||||
// | // | ||||
void foo(aligned_double x, double * y __attribute__((align_value(32))), | void foo(aligned_double x, double * y __attribute__((align_value(32))), | ||||
Context not available. | |||||
aligned_double a; | aligned_double a; | ||||
}; | }; | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3fooR9ad_struct | // CHECK-LABEL: @_Z3fooR9ad_struct( | ||||
// CHECK-SAME: (%struct.ad_struct* nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca %struct.ad_struct*, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca %struct.ad_struct*, align 8 | ||||
// CHECK-NEXT: store %struct.ad_struct* [[X]], %struct.ad_struct** [[X_ADDR]], align 8 | // CHECK-NEXT: store %struct.ad_struct* [[X:%.*]], %struct.ad_struct** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load %struct.ad_struct*, %struct.ad_struct** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load %struct.ad_struct*, %struct.ad_struct** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AD_STRUCT:%.*]], %struct.ad_struct* [[TMP0]], i32 0, i32 0 | // CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AD_STRUCT:%.*]], %struct.ad_struct* [[TMP0]], i32 0, i32 0 | ||||
// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[A]], align 8 | // CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[A]], align 8 | ||||
Context not available. | |||||
return x.a; | return x.a; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3gooP9ad_struct | // CHECK-LABEL: @_Z3gooP9ad_struct( | ||||
// CHECK-SAME: (%struct.ad_struct* [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca %struct.ad_struct*, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca %struct.ad_struct*, align 8 | ||||
// CHECK-NEXT: store %struct.ad_struct* [[X]], %struct.ad_struct** [[X_ADDR]], align 8 | // CHECK-NEXT: store %struct.ad_struct* [[X:%.*]], %struct.ad_struct** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load %struct.ad_struct*, %struct.ad_struct** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load %struct.ad_struct*, %struct.ad_struct** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AD_STRUCT:%.*]], %struct.ad_struct* [[TMP0]], i32 0, i32 0 | // CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AD_STRUCT:%.*]], %struct.ad_struct* [[TMP0]], i32 0, i32 0 | ||||
// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[A]], align 8 | // CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[A]], align 8 | ||||
Context not available. | |||||
return x->a; | return x->a; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3barPPd | // CHECK-LABEL: @_Z3barPPd( | ||||
// CHECK-SAME: (double** [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | ||||
// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 | // CHECK-NEXT: store double** [[X:%.*]], double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[TMP0]], align 8 | // CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[TMP0]], align 8 | ||||
// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(double* [[TMP1]], i64 64) ] | // CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(double* [[TMP1]], i64 64) ] | ||||
Context not available. | |||||
return *x; | return *x; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3carRPd | // CHECK-LABEL: @_Z3carRPd( | ||||
// CHECK-SAME: (double** nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | ||||
// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 | // CHECK-NEXT: store double** [[X:%.*]], double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[TMP0]], align 8 | // CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[TMP0]], align 8 | ||||
// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(double* [[TMP1]], i64 64) ] | // CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(double* [[TMP1]], i64 64) ] | ||||
Context not available. | |||||
return x; | return x; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3darPPd | // CHECK-LABEL: @_Z3darPPd( | ||||
// CHECK-SAME: (double** [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | ||||
// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 | // CHECK-NEXT: store double** [[X:%.*]], double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double*, double** [[TMP0]], i64 5 | // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double*, double** [[TMP0]], i64 5 | ||||
// CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[ARRAYIDX]], align 8 | // CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[ARRAYIDX]], align 8 | ||||
Context not available. | |||||
} | } | ||||
aligned_double eep(); | aligned_double eep(); | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3retv() #0 | // CHECK-LABEL: @_Z3retv( | ||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[CALL:%.*]] = call double* @_Z3eepv() | // CHECK-NEXT: [[CALL:%.*]] = call noundef double* @_Z3eepv() | ||||
// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(double* [[CALL]], i64 64) ] | // CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(double* [[CALL]], i64 64) ] | ||||
// CHECK-NEXT: ret double* [[CALL]] | // CHECK-NEXT: ret double* [[CALL]] | ||||
// | // | ||||
Context not available. | |||||
return eep(); | return eep(); | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3no1PPd | // CHECK-LABEL: @_Z3no1PPd( | ||||
// CHECK-SAME: (double** [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | ||||
// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 | // CHECK-NEXT: store double** [[X:%.*]], double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: ret double** [[TMP0]] | // CHECK-NEXT: ret double** [[TMP0]] | ||||
// | // | ||||
Context not available. | |||||
return x; | return x; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3no2RPd | // CHECK-LABEL: @_Z3no2RPd( | ||||
// CHECK-SAME: (double** nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | ||||
// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 | // CHECK-NEXT: store double** [[X:%.*]], double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: ret double** [[TMP0]] | // CHECK-NEXT: ret double** [[TMP0]] | ||||
// | // | ||||
Context not available. | |||||
return x; | return x; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3no3RPd | // CHECK-LABEL: @_Z3no3RPd( | ||||
// CHECK-SAME: (double** nonnull align 8 dereferenceable(8) [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double**, align 8 | ||||
// CHECK-NEXT: store double** [[X]], double*** [[X_ADDR]], align 8 | // CHECK-NEXT: store double** [[X:%.*]], double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double**, double*** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: ret double** [[TMP0]] | // CHECK-NEXT: ret double** [[TMP0]] | ||||
// | // | ||||
Context not available. | |||||
return &x; | return &x; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3no3Pd | // CHECK-LABEL: @_Z3no3Pd( | ||||
// CHECK-SAME: (double* align 64 [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 | ||||
// CHECK-NEXT: store double* [[X]], double** [[X_ADDR]], align 8 | // CHECK-NEXT: store double* [[X:%.*]], double** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double*, double** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double*, double** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* [[TMP0]], align 8 | // CHECK-NEXT: [[TMP1:%.*]] = load double, double* [[TMP0]], align 8 | ||||
// CHECK-NEXT: ret double [[TMP1]] | // CHECK-NEXT: ret double [[TMP1]] | ||||
Context not available. | |||||
return *x; | return *x; | ||||
} | } | ||||
// CHECK-LABEL: define {{[^@]+}}@_Z3no4Pd | // CHECK-LABEL: @_Z3no4Pd( | ||||
// CHECK-SAME: (double* align 64 [[X:%.*]]) #0 | |||||
// CHECK-NEXT: entry: | // CHECK-NEXT: entry: | ||||
// CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 | // CHECK-NEXT: [[X_ADDR:%.*]] = alloca double*, align 8 | ||||
// CHECK-NEXT: store double* [[X]], double** [[X_ADDR]], align 8 | // CHECK-NEXT: store double* [[X:%.*]], double** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: [[TMP0:%.*]] = load double*, double** [[X_ADDR]], align 8 | // CHECK-NEXT: [[TMP0:%.*]] = load double*, double** [[X_ADDR]], align 8 | ||||
// CHECK-NEXT: ret double* [[TMP0]] | // CHECK-NEXT: ret double* [[TMP0]] | ||||
// | // | ||||
Context not available. |