diff --git a/clang/lib/CodeGen/Targets/PPC.cpp b/clang/lib/CodeGen/Targets/PPC.cpp index 87792e00a7909bf..963f3ca10216ade 100644 --- a/clang/lib/CodeGen/Targets/PPC.cpp +++ b/clang/lib/CodeGen/Targets/PPC.cpp @@ -331,7 +331,7 @@ class PPC32_SVR4_ABIInfo : public DefaultABIInfo { bool IsSoftFloatABI; bool IsRetSmallStructInRegABI; // Size of GPR in bits. - static const unsigned RegLen = 32; + static const unsigned GPRBits = 32; static const int ArgGPRsNum = 8; CharUnits getParamTypeAlignment(QualType Ty) const; @@ -455,8 +455,8 @@ ABIArgInfo PPC32_SVR4_ABIInfo::classifyArgumentType(QualType Ty, if (TypeSize == 64 && ArgGPRsLeft % 2 == 1) --ArgGPRsLeft; - if (TypeSize <= RegLen * ArgGPRsLeft) { - ArgGPRsLeft -= TypeSize / RegLen; + if (TypeSize <= GPRBits * ArgGPRsLeft) { + ArgGPRsLeft -= TypeSize / GPRBits; if (IsComplex) return handleComplex(TypeSize); } diff --git a/clang/test/CodeGen/PowerPC/ppc32-complex-gnu-abi.c b/clang/test/CodeGen/PowerPC/ppc32-complex-gnu-abi.c index b73f88dc6d4056e..f9c9f17363ec630 100644 --- a/clang/test/CodeGen/PowerPC/ppc32-complex-gnu-abi.c +++ b/clang/test/CodeGen/PowerPC/ppc32-complex-gnu-abi.c @@ -5,6 +5,8 @@ // RUN: %clang_cc1 -triple powerpc-unknown-linux-gnu -fcomplex-ppc-gnu-abi \ // RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-GNU + + // CHECK-DEF-LABEL: define dso_local void @_cfloat // CHECK-DEF-SAME: (ptr dead_on_unwind noalias writable sret({ float, float }) align 4 [[AGG_RESULT:%.*]], ptr noundef byval({ float, float }) align 4 [[X:%.*]]) #[[ATTR0:[0-9]+]] { // CHECK-DEF-NEXT: entry: @@ -25,7 +27,7 @@ // CHECK-DEF-NEXT: store float [[AGG_RESULT_REAL]], ptr [[AGG_RESULT_REALP3]], align 4 // CHECK-DEF-NEXT: store float [[AGG_RESULT_IMAG]], ptr [[AGG_RESULT_IMAGP4]], align 4 // CHECK-DEF-NEXT: ret void -// + // CHECK-GNU-LABEL: define dso_local [1 x i64] @_cfloat // CHECK-GNU-SAME: ([1 x i64] noundef [[X_COERCE:%.*]]) #[[ATTR0:[0-9]+]] { // CHECK-GNU-NEXT: entry: @@ -42,7 +44,7 @@ // CHECK-GNU-NEXT: store float [[X_IMAG]], ptr [[RETVAL_IMAGP]], align 4 // CHECK-GNU-NEXT: [[TMP0:%.*]] = load [1 x i64], ptr [[RETVAL]], align 4 // CHECK-GNU-NEXT: ret [1 x i64] [[TMP0]] -// + _Complex float _cfloat(_Complex float x) { return x; } @@ -67,7 +69,7 @@ _Complex float _cfloat(_Complex float x) { // CHECK-DEF-NEXT: store double [[AGG_RESULT_REAL]], ptr [[AGG_RESULT_REALP3]], align 8 // CHECK-DEF-NEXT: store double [[AGG_RESULT_IMAG]], ptr [[AGG_RESULT_IMAGP4]], align 8 // CHECK-DEF-NEXT: ret void -// + // CHECK-GNU-LABEL: define dso_local [4 x i32] @_cdouble // CHECK-GNU-SAME: ([4 x i32] noundef [[X_COERCE:%.*]]) #[[ATTR0]] { // CHECK-GNU-NEXT: entry: @@ -109,7 +111,7 @@ _Complex double _cdouble(_Complex double x) { // CHECK-DEF-NEXT: store ppc_fp128 [[AGG_RESULT_REAL]], ptr [[AGG_RESULT_REALP3]], align 16 // CHECK-DEF-NEXT: store ppc_fp128 [[AGG_RESULT_IMAG]], ptr [[AGG_RESULT_IMAGP4]], align 16 // CHECK-DEF-NEXT: ret void -// + // CHECK-GNU-LABEL: define dso_local [8 x i32] @_cldouble // CHECK-GNU-SAME: ([8 x i32] noundef [[X_COERCE:%.*]]) #[[ATTR0]] { // CHECK-GNU-NEXT: entry: @@ -126,7 +128,7 @@ _Complex double _cdouble(_Complex double x) { // CHECK-GNU-NEXT: store ppc_fp128 [[X_IMAG]], ptr [[RETVAL_IMAGP]], align 16 // CHECK-GNU-NEXT: [[TMP0:%.*]] = load [8 x i32], ptr [[RETVAL]], align 16 // CHECK-GNU-NEXT: ret [8 x i32] [[TMP0]] -// + _Complex long double _cldouble(_Complex long double x) { return x; } @@ -164,7 +166,7 @@ _Complex long double _cldouble(_Complex long double x) { // CHECK-DEF-NEXT: store double [[AGG_RESULT_REAL]], ptr [[AGG_RESULT_REALP3]], align 8 // CHECK-DEF-NEXT: store double [[AGG_RESULT_IMAG]], ptr [[AGG_RESULT_IMAGP4]], align 8 // CHECK-DEF-NEXT: ret void -// + // CHECK-GNU-LABEL: define dso_local [4 x i32] @testComplexDouble // CHECK-GNU-SAME: (i32 noundef [[W:%.*]], [1 x i64] noundef [[X_COERCE:%.*]], [4 x i32] noundef [[Z_COERCE:%.*]]) #[[ATTR0]] { // CHECK-GNU-NEXT: entry: @@ -198,7 +200,7 @@ _Complex long double _cldouble(_Complex long double x) { // CHECK-GNU-NEXT: store double [[COERCE1_IMAG]], ptr [[RETVAL_IMAGP]], align 8 // CHECK-GNU-NEXT: [[TMP1:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 // CHECK-GNU-NEXT: ret [4 x i32] [[TMP1]] -// + _Complex double testComplexDouble(int w, _Complex float x, _Complex double z) { return _cdouble(z); @@ -249,7 +251,7 @@ _Complex double testComplexDouble(int w, _Complex float x, _Complex double z) // CHECK-DEF-NEXT: store double [[AGG_RESULT_REAL]], ptr [[AGG_RESULT_REALP4]], align 8 // CHECK-DEF-NEXT: store double [[AGG_RESULT_IMAG]], ptr [[AGG_RESULT_IMAGP5]], align 8 // CHECK-DEF-NEXT: ret void -// + // CHECK-GNU-LABEL: define dso_local [4 x i32] @checkComplexDoubleOnStack // CHECK-GNU-SAME: (i32 noundef [[X1:%.*]], [1 x i64] noundef [[CF_COERCE:%.*]], i32 noundef [[X2:%.*]], ptr noundef byval({ double, double }) align 8 [[CD:%.*]]) #[[ATTR0]] { // CHECK-GNU-NEXT: entry: @@ -294,7 +296,7 @@ _Complex double testComplexDouble(int w, _Complex float x, _Complex double z) // CHECK-GNU-NEXT: store double [[COERCE2_IMAG]], ptr [[RETVAL_IMAGP]], align 8 // CHECK-GNU-NEXT: [[TMP3:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 // CHECK-GNU-NEXT: ret [4 x i32] [[TMP3]] -// + _Complex double checkComplexDoubleOnStack(int x1, _Complex float cf, int x2, _Complex double cd) { return testComplexDouble(x2, cf, cd); @@ -343,7 +345,7 @@ _Complex double checkComplexDoubleOnStack(int x1, _Complex float cf, int x2, _Co // CHECK-DEF-NEXT: store double [[AGG_RESULT_REAL]], ptr [[AGG_RESULT_REALP4]], align 8 // CHECK-DEF-NEXT: store double [[AGG_RESULT_IMAG]], ptr [[AGG_RESULT_IMAGP5]], align 8 // CHECK-DEF-NEXT: ret void -// + // CHECK-GNU-LABEL: define dso_local [4 x i32] @checkComplexFloatOnStack // CHECK-GNU-SAME: ([4 x i32] noundef [[_CD1_COERCE:%.*]], [1 x i64] noundef [[_CF1_COERCE:%.*]], i32 noundef [[Y:%.*]], ptr noundef byval({ float, float }) align 4 [[_CF2:%.*]]) #[[ATTR0]] { // CHECK-GNU-NEXT: entry: @@ -387,7 +389,7 @@ _Complex double checkComplexDoubleOnStack(int x1, _Complex float cf, int x2, _Co // CHECK-GNU-NEXT: store double [[COERCE1_IMAG]], ptr [[RETVAL_IMAGP]], align 8 // CHECK-GNU-NEXT: [[TMP2:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 // CHECK-GNU-NEXT: ret [4 x i32] [[TMP2]] -// + _Complex double checkComplexFloatOnStack(_Complex double _cd1, _Complex float _cf1, int y, _Complex float _cf2) { return checkComplexDoubleOnStack(y, _cf2, 0, _cd1); diff --git a/clang/test/CodeGen/PowerPC/ppc32-complex-soft-float-gnu-abi.c b/clang/test/CodeGen/PowerPC/ppc32-complex-soft-float-gnu-abi.c index 0f60dfc72f0d6cf..b9c7de0a32dc660 100644 --- a/clang/test/CodeGen/PowerPC/ppc32-complex-soft-float-gnu-abi.c +++ b/clang/test/CodeGen/PowerPC/ppc32-complex-soft-float-gnu-abi.c @@ -23,7 +23,7 @@ // CHECK-GNU-DEF-NEXT: store ppc_fp128 [[X_IMAG]], ptr [[RETVAL_IMAGP]], align 16 // CHECK-GNU-DEF-NEXT: [[TMP0:%.*]] = load [8 x i32], ptr [[RETVAL]], align 16 // CHECK-GNU-DEF-NEXT: ret [8 x i32] [[TMP0]] -// + // CHECK-GNU-SOFT-FLOAT-LABEL: define dso_local [8 x i32] @_cldouble // CHECK-GNU-SOFT-FLOAT-SAME: (float noundef [[F:%.*]], ptr noundef byval({ ppc_fp128, ppc_fp128 }) align 16 [[X:%.*]]) #[[ATTR0:[0-9]+]] { // CHECK-GNU-SOFT-FLOAT-NEXT: entry: @@ -40,21 +40,23 @@ // CHECK-GNU-SOFT-FLOAT-NEXT: store ppc_fp128 [[X_IMAG]], ptr [[RETVAL_IMAGP]], align 16 // CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP0:%.*]] = load [8 x i32], ptr [[RETVAL]], align 16 // CHECK-GNU-SOFT-FLOAT-NEXT: ret [8 x i32] [[TMP0]] -// + _Complex long double _cldouble(float f, _Complex long double x) { return x; } // CHECK-GNU-DEF-LABEL: define dso_local [4 x i32] @testComplexDouble -// CHECK-GNU-DEF-SAME: (float noundef [[W:%.*]], [1 x i64] noundef [[X_COERCE:%.*]], [4 x i32] noundef [[Z_COERCE:%.*]]) #[[ATTR0]] { +// CHECK-GNU-DEF-SAME: (float noundef [[W:%.*]], [1 x i64] noundef [[X_COERCE:%.*]], float noundef [[Y:%.*]], [4 x i32] noundef [[Z_COERCE:%.*]]) #[[ATTR0]] { // CHECK-GNU-DEF-NEXT: entry: // CHECK-GNU-DEF-NEXT: [[RETVAL:%.*]] = alloca { double, double }, align 8 // CHECK-GNU-DEF-NEXT: [[X:%.*]] = alloca { float, float }, align 4 // CHECK-GNU-DEF-NEXT: [[Z:%.*]] = alloca { double, double }, align 8 // CHECK-GNU-DEF-NEXT: [[W_ADDR:%.*]] = alloca float, align 4 +// CHECK-GNU-DEF-NEXT: [[Y_ADDR:%.*]] = alloca float, align 4 // CHECK-GNU-DEF-NEXT: store [1 x i64] [[X_COERCE]], ptr [[X]], align 4 // CHECK-GNU-DEF-NEXT: store [4 x i32] [[Z_COERCE]], ptr [[Z]], align 8 // CHECK-GNU-DEF-NEXT: store float [[W]], ptr [[W_ADDR]], align 4 +// CHECK-GNU-DEF-NEXT: store float [[Y]], ptr [[Y_ADDR]], align 4 // CHECK-GNU-DEF-NEXT: [[Z_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[Z]], i32 0, i32 0 // CHECK-GNU-DEF-NEXT: [[Z_REAL:%.*]] = load double, ptr [[Z_REALP]], align 8 // CHECK-GNU-DEF-NEXT: [[Z_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[Z]], i32 0, i32 1 @@ -65,17 +67,17 @@ _Complex long double _cldouble(float f, _Complex long double x) { // CHECK-GNU-DEF-NEXT: store double [[Z_IMAG]], ptr [[RETVAL_IMAGP]], align 8 // CHECK-GNU-DEF-NEXT: [[TMP0:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 // CHECK-GNU-DEF-NEXT: ret [4 x i32] [[TMP0]] -// + // CHECK-GNU-SOFT-FLOAT-LABEL: define dso_local [4 x i32] @testComplexDouble -// CHECK-GNU-SOFT-FLOAT-SAME: (float noundef [[W:%.*]], [1 x i64] noundef [[X_COERCE:%.*]], [4 x i32] noundef [[Z_COERCE:%.*]]) #[[ATTR0]] { +// CHECK-GNU-SOFT-FLOAT-SAME: (float noundef [[W:%.*]], [1 x i64] noundef [[X_COERCE:%.*]], float noundef [[Y:%.*]], ptr noundef byval({ double, double }) align 8 [[Z:%.*]]) #[[ATTR0]] { // CHECK-GNU-SOFT-FLOAT-NEXT: entry: // CHECK-GNU-SOFT-FLOAT-NEXT: [[RETVAL:%.*]] = alloca { double, double }, align 8 // CHECK-GNU-SOFT-FLOAT-NEXT: [[X:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[Z:%.*]] = alloca { double, double }, align 8 // CHECK-GNU-SOFT-FLOAT-NEXT: [[W_ADDR:%.*]] = alloca float, align 4 +// CHECK-GNU-SOFT-FLOAT-NEXT: [[Y_ADDR:%.*]] = alloca float, align 4 // CHECK-GNU-SOFT-FLOAT-NEXT: store [1 x i64] [[X_COERCE]], ptr [[X]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: store [4 x i32] [[Z_COERCE]], ptr [[Z]], align 8 // CHECK-GNU-SOFT-FLOAT-NEXT: store float [[W]], ptr [[W_ADDR]], align 4 +// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[Y]], ptr [[Y_ADDR]], align 4 // CHECK-GNU-SOFT-FLOAT-NEXT: [[Z_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[Z]], i32 0, i32 0 // CHECK-GNU-SOFT-FLOAT-NEXT: [[Z_REAL:%.*]] = load double, ptr [[Z_REALP]], align 8 // CHECK-GNU-SOFT-FLOAT-NEXT: [[Z_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[Z]], i32 0, i32 1 @@ -86,201 +88,8 @@ _Complex long double _cldouble(float f, _Complex long double x) { // CHECK-GNU-SOFT-FLOAT-NEXT: store double [[Z_IMAG]], ptr [[RETVAL_IMAGP]], align 8 // CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP0:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 // CHECK-GNU-SOFT-FLOAT-NEXT: ret [4 x i32] [[TMP0]] -// -_Complex double testComplexDouble(float w, _Complex float x, _Complex double z) -{ - return z; -} - -// CHECK-GNU-DEF-LABEL: define dso_local [4 x i32] @checkComplexDoubleOnStack -// CHECK-GNU-DEF-SAME: (float noundef [[X1:%.*]], [1 x i64] noundef [[CF_COERCE:%.*]], float noundef [[X2:%.*]], [4 x i32] noundef [[CD_COERCE:%.*]]) #[[ATTR0]] { -// CHECK-GNU-DEF-NEXT: entry: -// CHECK-GNU-DEF-NEXT: [[RETVAL:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: [[CF:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-DEF-NEXT: [[CD:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: [[X1_ADDR:%.*]] = alloca float, align 4 -// CHECK-GNU-DEF-NEXT: [[X2_ADDR:%.*]] = alloca float, align 4 -// CHECK-GNU-DEF-NEXT: [[COERCE:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-DEF-NEXT: [[COERCE1:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE2:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: store [1 x i64] [[CF_COERCE]], ptr [[CF]], align 4 -// CHECK-GNU-DEF-NEXT: store [4 x i32] [[CD_COERCE]], ptr [[CD]], align 8 -// CHECK-GNU-DEF-NEXT: store float [[X1]], ptr [[X1_ADDR]], align 4 -// CHECK-GNU-DEF-NEXT: store float [[X2]], ptr [[X2_ADDR]], align 4 -// CHECK-GNU-DEF-NEXT: [[TMP0:%.*]] = load float, ptr [[X2_ADDR]], align 4 -// CHECK-GNU-DEF-NEXT: [[CF_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[CF]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[CF_REAL:%.*]] = load float, ptr [[CF_REALP]], align 4 -// CHECK-GNU-DEF-NEXT: [[CF_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[CF]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: [[CF_IMAG:%.*]] = load float, ptr [[CF_IMAGP]], align 4 -// CHECK-GNU-DEF-NEXT: [[CD_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[CD]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[CD_REAL:%.*]] = load double, ptr [[CD_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: [[CD_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[CD]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: [[CD_IMAG:%.*]] = load double, ptr [[CD_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[COERCE_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: store float [[CF_REAL]], ptr [[COERCE_REALP]], align 4 -// CHECK-GNU-DEF-NEXT: store float [[CF_IMAG]], ptr [[COERCE_IMAGP]], align 4 -// CHECK-GNU-DEF-NEXT: [[TMP1:%.*]] = load [1 x i64], ptr [[COERCE]], align 4 -// CHECK-GNU-DEF-NEXT: [[COERCE1_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[COERCE1_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: store double [[CD_REAL]], ptr [[COERCE1_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: store double [[CD_IMAG]], ptr [[COERCE1_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[TMP2:%.*]] = load [4 x i32], ptr [[COERCE1]], align 8 -// CHECK-GNU-DEF-NEXT: [[CALL:%.*]] = call [4 x i32] @testComplexDouble(float noundef [[TMP0]], [1 x i64] noundef [[TMP1]], [4 x i32] noundef [[TMP2]]) -// CHECK-GNU-DEF-NEXT: store [4 x i32] [[CALL]], ptr [[COERCE2]], align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE2_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE2]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[COERCE2_REAL:%.*]] = load double, ptr [[COERCE2_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE2_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE2]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: [[COERCE2_IMAG:%.*]] = load double, ptr [[COERCE2_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[RETVAL_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[RETVAL_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: store double [[COERCE2_REAL]], ptr [[RETVAL_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: store double [[COERCE2_IMAG]], ptr [[RETVAL_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[TMP3:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 -// CHECK-GNU-DEF-NEXT: ret [4 x i32] [[TMP3]] -// -// CHECK-GNU-SOFT-FLOAT-LABEL: define dso_local [4 x i32] @checkComplexDoubleOnStack -// CHECK-GNU-SOFT-FLOAT-SAME: (float noundef [[X1:%.*]], [1 x i64] noundef [[CF_COERCE:%.*]], float noundef [[X2:%.*]], ptr noundef byval({ double, double }) align 8 [[CD:%.*]]) #[[ATTR0]] { -// CHECK-GNU-SOFT-FLOAT-NEXT: entry: -// CHECK-GNU-SOFT-FLOAT-NEXT: [[RETVAL:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CF:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[X1_ADDR:%.*]] = alloca float, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[X2_ADDR:%.*]] = alloca float, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE2:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: store [1 x i64] [[CF_COERCE]], ptr [[CF]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[X1]], ptr [[X1_ADDR]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[X2]], ptr [[X2_ADDR]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP0:%.*]] = load float, ptr [[X2_ADDR]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CF_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[CF]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CF_REAL:%.*]] = load float, ptr [[CF_REALP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CF_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[CF]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CF_IMAG:%.*]] = load float, ptr [[CF_IMAGP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CD_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[CD]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CD_REAL:%.*]] = load double, ptr [[CD_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CD_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[CD]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CD_IMAG:%.*]] = load double, ptr [[CD_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[CF_REAL]], ptr [[COERCE_REALP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[CF_IMAG]], ptr [[COERCE_IMAGP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP1:%.*]] = load [1 x i64], ptr [[COERCE]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[CD_REAL]], ptr [[COERCE1_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[CD_IMAG]], ptr [[COERCE1_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP2:%.*]] = load [4 x i32], ptr [[COERCE1]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CALL:%.*]] = call [4 x i32] @testComplexDouble(float noundef [[TMP0]], [1 x i64] noundef [[TMP1]], [4 x i32] noundef [[TMP2]]) -// CHECK-GNU-SOFT-FLOAT-NEXT: store [4 x i32] [[CALL]], ptr [[COERCE2]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE2_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE2]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE2_REAL:%.*]] = load double, ptr [[COERCE2_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE2_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE2]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE2_IMAG:%.*]] = load double, ptr [[COERCE2_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[RETVAL_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[RETVAL_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[COERCE2_REAL]], ptr [[RETVAL_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[COERCE2_IMAG]], ptr [[RETVAL_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP3:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: ret [4 x i32] [[TMP3]] -// -_Complex double checkComplexDoubleOnStack(float x1, _Complex float cf, float x2, _Complex double cd) -{ - return testComplexDouble(x2, cf, cd); -} -// CHECK-GNU-DEF-LABEL: define dso_local [4 x i32] @checkComplexFloatOnStack -// CHECK-GNU-DEF-SAME: ([4 x i32] noundef [[_CD1_COERCE:%.*]], [1 x i64] noundef [[_CF1_COERCE:%.*]], float noundef [[Y:%.*]], [1 x i64] noundef [[_CF2_COERCE:%.*]]) #[[ATTR0]] { -// CHECK-GNU-DEF-NEXT: entry: -// CHECK-GNU-DEF-NEXT: [[RETVAL:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: [[_CD1:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: [[_CF1:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-DEF-NEXT: [[_CF2:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-DEF-NEXT: [[Y_ADDR:%.*]] = alloca float, align 4 -// CHECK-GNU-DEF-NEXT: [[COERCE:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-DEF-NEXT: [[COERCE1:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE2:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-DEF-NEXT: store [4 x i32] [[_CD1_COERCE]], ptr [[_CD1]], align 8 -// CHECK-GNU-DEF-NEXT: store [1 x i64] [[_CF1_COERCE]], ptr [[_CF1]], align 4 -// CHECK-GNU-DEF-NEXT: store [1 x i64] [[_CF2_COERCE]], ptr [[_CF2]], align 4 -// CHECK-GNU-DEF-NEXT: store float [[Y]], ptr [[Y_ADDR]], align 4 -// CHECK-GNU-DEF-NEXT: [[TMP0:%.*]] = load float, ptr [[Y_ADDR]], align 4 -// CHECK-GNU-DEF-NEXT: [[_CF2_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[_CF2]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[_CF2_REAL:%.*]] = load float, ptr [[_CF2_REALP]], align 4 -// CHECK-GNU-DEF-NEXT: [[_CF2_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[_CF2]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: [[_CF2_IMAG:%.*]] = load float, ptr [[_CF2_IMAGP]], align 4 -// CHECK-GNU-DEF-NEXT: [[_CD1_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[_CD1]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[_CD1_REAL:%.*]] = load double, ptr [[_CD1_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: [[_CD1_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[_CD1]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: [[_CD1_IMAG:%.*]] = load double, ptr [[_CD1_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[COERCE_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: store float [[_CF2_REAL]], ptr [[COERCE_REALP]], align 4 -// CHECK-GNU-DEF-NEXT: store float [[_CF2_IMAG]], ptr [[COERCE_IMAGP]], align 4 -// CHECK-GNU-DEF-NEXT: [[TMP1:%.*]] = load [1 x i64], ptr [[COERCE]], align 4 -// CHECK-GNU-DEF-NEXT: [[COERCE1_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[COERCE1_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: store double [[_CD1_REAL]], ptr [[COERCE1_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: store double [[_CD1_IMAG]], ptr [[COERCE1_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[TMP2:%.*]] = load [4 x i32], ptr [[COERCE1]], align 8 -// CHECK-GNU-DEF-NEXT: [[CALL:%.*]] = call [4 x i32] @checkComplexDoubleOnStack(float noundef [[TMP0]], [1 x i64] noundef [[TMP1]], float noundef 0.000000e+00, [4 x i32] noundef [[TMP2]]) -// CHECK-GNU-DEF-NEXT: store [4 x i32] [[CALL]], ptr [[COERCE2]], align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE2_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE2]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[COERCE2_REAL:%.*]] = load double, ptr [[COERCE2_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: [[COERCE2_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE2]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: [[COERCE2_IMAG:%.*]] = load double, ptr [[COERCE2_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[RETVAL_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 0 -// CHECK-GNU-DEF-NEXT: [[RETVAL_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 1 -// CHECK-GNU-DEF-NEXT: store double [[COERCE2_REAL]], ptr [[RETVAL_REALP]], align 8 -// CHECK-GNU-DEF-NEXT: store double [[COERCE2_IMAG]], ptr [[RETVAL_IMAGP]], align 8 -// CHECK-GNU-DEF-NEXT: [[TMP3:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 -// CHECK-GNU-DEF-NEXT: ret [4 x i32] [[TMP3]] -// -// CHECK-GNU-SOFT-FLOAT-LABEL: define dso_local [4 x i32] @checkComplexFloatOnStack -// CHECK-GNU-SOFT-FLOAT-SAME: ([4 x i32] noundef [[_CD1_COERCE:%.*]], [1 x i64] noundef [[_CF1_COERCE:%.*]], float noundef [[Y:%.*]], ptr noundef byval({ float, float }) align 4 [[_CF2:%.*]]) #[[ATTR0]] { -// CHECK-GNU-SOFT-FLOAT-NEXT: entry: -// CHECK-GNU-SOFT-FLOAT-NEXT: [[RETVAL:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CD1:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CF1:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[Y_ADDR:%.*]] = alloca float, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE:%.*]] = alloca { float, float }, align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[INDIRECT_ARG_TEMP:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1:%.*]] = alloca { double, double }, align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: store [4 x i32] [[_CD1_COERCE]], ptr [[_CD1]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: store [1 x i64] [[_CF1_COERCE]], ptr [[_CF1]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[Y]], ptr [[Y_ADDR]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP0:%.*]] = load float, ptr [[Y_ADDR]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CF2_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[_CF2]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CF2_REAL:%.*]] = load float, ptr [[_CF2_REALP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CF2_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[_CF2]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CF2_IMAG:%.*]] = load float, ptr [[_CF2_IMAGP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CD1_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[_CD1]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CD1_REAL:%.*]] = load double, ptr [[_CD1_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CD1_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[_CD1]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[_CD1_IMAG:%.*]] = load double, ptr [[_CD1_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE_REALP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE_IMAGP:%.*]] = getelementptr inbounds { float, float }, ptr [[COERCE]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[_CF2_REAL]], ptr [[COERCE_REALP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: store float [[_CF2_IMAG]], ptr [[COERCE_IMAGP]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP1:%.*]] = load [1 x i64], ptr [[COERCE]], align 4 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[INDIRECT_ARG_TEMP_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[INDIRECT_ARG_TEMP]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[INDIRECT_ARG_TEMP_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[INDIRECT_ARG_TEMP]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[_CD1_REAL]], ptr [[INDIRECT_ARG_TEMP_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[_CD1_IMAG]], ptr [[INDIRECT_ARG_TEMP_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[CALL:%.*]] = call [4 x i32] @checkComplexDoubleOnStack(float noundef [[TMP0]], [1 x i64] noundef [[TMP1]], float noundef 0.000000e+00, ptr noundef byval({ double, double }) align 8 [[INDIRECT_ARG_TEMP]]) -// CHECK-GNU-SOFT-FLOAT-NEXT: store [4 x i32] [[CALL]], ptr [[COERCE1]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1_REAL:%.*]] = load double, ptr [[COERCE1_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[COERCE1]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[COERCE1_IMAG:%.*]] = load double, ptr [[COERCE1_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[RETVAL_REALP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 0 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[RETVAL_IMAGP:%.*]] = getelementptr inbounds { double, double }, ptr [[RETVAL]], i32 0, i32 1 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[COERCE1_REAL]], ptr [[RETVAL_REALP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: store double [[COERCE1_IMAG]], ptr [[RETVAL_IMAGP]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: [[TMP2:%.*]] = load [4 x i32], ptr [[RETVAL]], align 8 -// CHECK-GNU-SOFT-FLOAT-NEXT: ret [4 x i32] [[TMP2]] -// -_Complex double checkComplexFloatOnStack(_Complex double _cd1, _Complex float _cf1, float y, _Complex float _cf2) +_Complex double testComplexDouble(float w, _Complex float x, float y, _Complex double z) { - return checkComplexDoubleOnStack(y, _cf2, 0, _cd1); + return z; } diff --git a/clang/test/Driver/ppc32-fcomplex-ppc-gnu-abi.c b/clang/test/Driver/ppc32-fcomplex-ppc-gnu-abi.c index 987e77d8f149f45..a757d11ff2a485f 100644 --- a/clang/test/Driver/ppc32-fcomplex-ppc-gnu-abi.c +++ b/clang/test/Driver/ppc32-fcomplex-ppc-gnu-abi.c @@ -1,15 +1,9 @@ -// RUN: not %clang %s --target=x86_64 -fcomplex-ppc-gnu-abi 2>&1 \ -// RUN: | FileCheck %s -check-prefix=X86_64 -// X86_64: error: unsupported option '-fcomplex-ppc-gnu-abi' for target 'x86_64' +// RUN: %clang -c --target=ppc32 -fcomplex-ppc-gnu-abi %s 2>&1 // RUN: not %clang %s --target=ppc64 -fcomplex-ppc-gnu-abi 2>&1 \ -// RUN: | FileCheck %s -check-prefix=PPC64 -// PPC64: error: unsupported option '-fcomplex-ppc-gnu-abi' for target 'ppc64' +// RUN: | FileCheck %s -check-prefix=CHECK-ERROR -// RUN: not %clang %s --target=riscv64 -fcomplex-ppc-gnu-abi 2>&1 \ -// RUN: | FileCheck %s -check-prefix=RISCV64 -// RISCV64: error: unsupported option '-fcomplex-ppc-gnu-abi' for target 'riscv64' +// RUN: not %clang %s --target=ppc32-unknown-unknown-coff -fcomplex-ppc-gnu-abi 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK-ERROR -// RUN: not %clang %s --target=aarch64 -fcomplex-ppc-gnu-abi 2>&1 \ -// RUN: | FileCheck %s -check-prefix=ARM64 -// ARM64: error: unsupported option '-fcomplex-ppc-gnu-abi' for target 'aarch64' +// CHECK-ERROR: error: unsupported option '-fcomplex-ppc-gnu-abi' for target