Skip to content

Commit b096b28

Browse files
Merge branch 'main' into flang/fix-pause-lowering
2 parents a0a69ca + a8cffb8 commit b096b28

File tree

59 files changed

+5709
-4435
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+5709
-4435
lines changed

clang/include/clang/AST/CXXInheritance.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class CXXBasePaths {
192192
/// Determine whether the path from the most-derived type to the
193193
/// given base type is ambiguous (i.e., it refers to multiple subobjects of
194194
/// the same base type).
195-
bool isAmbiguous(CanQualType BaseType);
195+
bool isAmbiguous(CanQualType BaseType) const;
196196

197197
/// Whether we are finding multiple paths to detect ambiguities.
198198
bool isFindingAmbiguities() const { return FindAmbiguities; }

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,51 +1626,6 @@ static bool interp__builtin_elementwise_abs(InterpState &S, CodePtr OpPC,
16261626
return true;
16271627
}
16281628

1629-
/// Can be called with an integer or vector as the first and only parameter.
1630-
static bool interp__builtin_elementwise_popcount(InterpState &S, CodePtr OpPC,
1631-
const InterpFrame *Frame,
1632-
const CallExpr *Call,
1633-
unsigned BuiltinID) {
1634-
assert(Call->getNumArgs() == 1);
1635-
if (Call->getArg(0)->getType()->isIntegerType()) {
1636-
APSInt Val = popToAPSInt(S, Call->getArg(0));
1637-
1638-
if (BuiltinID == Builtin::BI__builtin_elementwise_popcount) {
1639-
pushInteger(S, Val.popcount(), Call->getType());
1640-
} else {
1641-
pushInteger(S, Val.reverseBits(), Call->getType());
1642-
}
1643-
return true;
1644-
}
1645-
// Otherwise, the argument must be a vector.
1646-
assert(Call->getArg(0)->getType()->isVectorType());
1647-
const Pointer &Arg = S.Stk.pop<Pointer>();
1648-
assert(Arg.getFieldDesc()->isPrimitiveArray());
1649-
const Pointer &Dst = S.Stk.peek<Pointer>();
1650-
assert(Dst.getFieldDesc()->isPrimitiveArray());
1651-
assert(Arg.getFieldDesc()->getNumElems() ==
1652-
Dst.getFieldDesc()->getNumElems());
1653-
1654-
QualType ElemType = Arg.getFieldDesc()->getElemQualType();
1655-
PrimType ElemT = *S.getContext().classify(ElemType);
1656-
unsigned NumElems = Arg.getNumElems();
1657-
1658-
// FIXME: Reading from uninitialized vector elements?
1659-
for (unsigned I = 0; I != NumElems; ++I) {
1660-
INT_TYPE_SWITCH_NO_BOOL(ElemT, {
1661-
if (BuiltinID == Builtin::BI__builtin_elementwise_popcount) {
1662-
Dst.elem<T>(I) = T::from(Arg.elem<T>(I).toAPSInt().popcount());
1663-
} else {
1664-
Dst.elem<T>(I) =
1665-
T::from(Arg.elem<T>(I).toAPSInt().reverseBits().getZExtValue());
1666-
}
1667-
});
1668-
}
1669-
Dst.initializeAllElements();
1670-
1671-
return true;
1672-
}
1673-
16741629
/// Can be called with an integer or vector as the first and only parameter.
16751630
static bool interp__builtin_elementwise_countzeroes(InterpState &S,
16761631
CodePtr OpPC,
@@ -2407,18 +2362,39 @@ static bool interp__builtin_elementwise_int_unaryop(
24072362
InterpState &S, CodePtr OpPC, const CallExpr *Call,
24082363
llvm::function_ref<APInt(const APSInt &)> Fn) {
24092364
assert(Call->getNumArgs() == 1);
2410-
assert(Call->getType()->isIntegerType());
24112365

24122366
// Single integer case.
24132367
if (!Call->getArg(0)->getType()->isVectorType()) {
2368+
assert(Call->getType()->isIntegerType());
24142369
APSInt Src = popToAPSInt(S, Call->getArg(0));
24152370
APInt Result = Fn(Src);
24162371
pushInteger(S, APSInt(std::move(Result), !Src.isSigned()), Call->getType());
24172372
return true;
24182373
}
24192374

2420-
// TODO: Add vector integer handling.
2421-
return false;
2375+
// Vector case.
2376+
const Pointer &Arg = S.Stk.pop<Pointer>();
2377+
assert(Arg.getFieldDesc()->isPrimitiveArray());
2378+
const Pointer &Dst = S.Stk.peek<Pointer>();
2379+
assert(Dst.getFieldDesc()->isPrimitiveArray());
2380+
assert(Arg.getFieldDesc()->getNumElems() ==
2381+
Dst.getFieldDesc()->getNumElems());
2382+
2383+
QualType ElemType = Arg.getFieldDesc()->getElemQualType();
2384+
PrimType ElemT = *S.getContext().classify(ElemType);
2385+
unsigned NumElems = Arg.getNumElems();
2386+
bool DestUnsigned = Call->getType()->isUnsignedIntegerOrEnumerationType();
2387+
2388+
for (unsigned I = 0; I != NumElems; ++I) {
2389+
INT_TYPE_SWITCH_NO_BOOL(ElemT, {
2390+
APSInt Src = Arg.elem<T>(I).toAPSInt();
2391+
APInt Result = Fn(Src);
2392+
Dst.elem<T>(I) = static_cast<T>(APSInt(std::move(Result), DestUnsigned));
2393+
});
2394+
}
2395+
Dst.initializeAllElements();
2396+
2397+
return true;
24222398
}
24232399

24242400
static bool interp__builtin_elementwise_int_binop(
@@ -4212,9 +4188,13 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
42124188
return interp__builtin_vector_reduce(S, OpPC, Call, BuiltinID);
42134189

42144190
case Builtin::BI__builtin_elementwise_popcount:
4191+
return interp__builtin_elementwise_int_unaryop(
4192+
S, OpPC, Call, [](const APSInt &Src) {
4193+
return APInt(Src.getBitWidth(), Src.popcount());
4194+
});
42154195
case Builtin::BI__builtin_elementwise_bitreverse:
4216-
return interp__builtin_elementwise_popcount(S, OpPC, Frame, Call,
4217-
BuiltinID);
4196+
return interp__builtin_elementwise_int_unaryop(
4197+
S, OpPC, Call, [](const APSInt &Src) { return Src.reverseBits(); });
42184198

42194199
case Builtin::BI__builtin_elementwise_abs:
42204200
return interp__builtin_elementwise_abs(S, OpPC, Frame, Call, BuiltinID);

clang/lib/AST/CXXInheritance.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ using namespace clang;
3434
/// ambiguous, i.e., there are two or more paths that refer to
3535
/// different base class subobjects of the same type. BaseType must be
3636
/// an unqualified, canonical class type.
37-
bool CXXBasePaths::isAmbiguous(CanQualType BaseType) {
37+
bool CXXBasePaths::isAmbiguous(CanQualType BaseType) const {
3838
BaseType = BaseType.getUnqualifiedType();
39-
IsVirtBaseAndNumberNonVirtBases Subobjects = ClassSubobjects[BaseType];
39+
IsVirtBaseAndNumberNonVirtBases Subobjects = ClassSubobjects.lookup(BaseType);
4040
return Subobjects.NumberOfNonVirtBases + (Subobjects.IsVirtBase ? 1 : 0) > 1;
4141
}
4242

clang/lib/Basic/Targets/Sparc.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,
165165
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
166166
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
167167
}
168+
Builder.defineMacro("__LONG_DOUBLE_128__");
168169
}
169170

170171
void SparcV9TargetInfo::getTargetDefines(const LangOptions &Opts,

clang/lib/Basic/Targets/Sparc.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,13 @@ class LLVM_LIBRARY_VISIBILITY SparcV8TargetInfo : public SparcTargetInfo {
166166
PtrDiffType = SignedLong;
167167
break;
168168
}
169+
170+
// The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
171+
// aligned.
172+
LongDoubleWidth = 128;
173+
LongDoubleAlign = 64;
174+
LongDoubleFormat = &llvm::APFloat::IEEEquad();
175+
169176
// Up to 32 bits (V8) or 64 bits (V9) are lock-free atomic, but we're
170177
// willing to do atomic ops on up to 64 bits.
171178
MaxAtomicPromoteWidth = 64;

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,36 @@ static mlir::Value getMaskVecValue(CIRGenBuilderTy &builder, mlir::Location loc,
8585
return maskVec;
8686
}
8787

88+
static mlir::Value emitX86MaskAddLogic(CIRGenBuilderTy &builder,
89+
mlir::Location loc,
90+
const std::string &intrinsicName,
91+
SmallVectorImpl<mlir::Value> &ops) {
92+
93+
auto intTy = cast<cir::IntType>(ops[0].getType());
94+
unsigned numElts = intTy.getWidth();
95+
mlir::Value lhsVec = getMaskVecValue(builder, loc, ops[0], numElts);
96+
mlir::Value rhsVec = getMaskVecValue(builder, loc, ops[1], numElts);
97+
mlir::Type vecTy = lhsVec.getType();
98+
mlir::Value resVec = emitIntrinsicCallOp(builder, loc, intrinsicName, vecTy,
99+
mlir::ValueRange{lhsVec, rhsVec});
100+
return builder.createBitcast(resVec, ops[0].getType());
101+
}
102+
103+
static mlir::Value emitX86MaskLogic(CIRGenBuilderTy &builder,
104+
mlir::Location loc,
105+
cir::BinOpKind binOpKind,
106+
SmallVectorImpl<mlir::Value> &ops,
107+
bool invertLHS = false) {
108+
unsigned numElts = cast<cir::IntType>(ops[0].getType()).getWidth();
109+
mlir::Value lhs = getMaskVecValue(builder, loc, ops[0], numElts);
110+
mlir::Value rhs = getMaskVecValue(builder, loc, ops[1], numElts);
111+
112+
if (invertLHS)
113+
lhs = builder.createNot(lhs);
114+
return builder.createBitcast(builder.createBinop(loc, lhs, binOpKind, rhs),
115+
ops[0].getType());
116+
}
117+
88118
mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
89119
const CallExpr *expr) {
90120
if (builtinID == Builtin::BI__builtin_cpu_is) {
@@ -743,38 +773,75 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
743773
case X86::BI__builtin_ia32_ktestzsi:
744774
case X86::BI__builtin_ia32_ktestcdi:
745775
case X86::BI__builtin_ia32_ktestzdi:
776+
cgm.errorNYI(expr->getSourceRange(),
777+
std::string("unimplemented X86 builtin call: ") +
778+
getContext().BuiltinInfo.getName(builtinID));
779+
return {};
746780
case X86::BI__builtin_ia32_kaddqi:
781+
return emitX86MaskAddLogic(builder, getLoc(expr->getExprLoc()),
782+
"x86.avx512.kadd.b", ops);
747783
case X86::BI__builtin_ia32_kaddhi:
784+
return emitX86MaskAddLogic(builder, getLoc(expr->getExprLoc()),
785+
"x86.avx512.kadd.w", ops);
748786
case X86::BI__builtin_ia32_kaddsi:
787+
return emitX86MaskAddLogic(builder, getLoc(expr->getExprLoc()),
788+
"x86.avx512.kadd.d", ops);
749789
case X86::BI__builtin_ia32_kadddi:
790+
return emitX86MaskAddLogic(builder, getLoc(expr->getExprLoc()),
791+
"x86.avx512.kadd.q", ops);
750792
case X86::BI__builtin_ia32_kandqi:
751793
case X86::BI__builtin_ia32_kandhi:
752794
case X86::BI__builtin_ia32_kandsi:
753795
case X86::BI__builtin_ia32_kanddi:
796+
return emitX86MaskLogic(builder, getLoc(expr->getExprLoc()),
797+
cir::BinOpKind::And, ops);
754798
case X86::BI__builtin_ia32_kandnqi:
755799
case X86::BI__builtin_ia32_kandnhi:
756800
case X86::BI__builtin_ia32_kandnsi:
757801
case X86::BI__builtin_ia32_kandndi:
802+
return emitX86MaskLogic(builder, getLoc(expr->getExprLoc()),
803+
cir::BinOpKind::And, ops, true);
758804
case X86::BI__builtin_ia32_korqi:
759805
case X86::BI__builtin_ia32_korhi:
760806
case X86::BI__builtin_ia32_korsi:
761807
case X86::BI__builtin_ia32_kordi:
808+
return emitX86MaskLogic(builder, getLoc(expr->getExprLoc()),
809+
cir::BinOpKind::Or, ops);
762810
case X86::BI__builtin_ia32_kxnorqi:
763811
case X86::BI__builtin_ia32_kxnorhi:
764812
case X86::BI__builtin_ia32_kxnorsi:
765813
case X86::BI__builtin_ia32_kxnordi:
814+
return emitX86MaskLogic(builder, getLoc(expr->getExprLoc()),
815+
cir::BinOpKind::Xor, ops, true);
766816
case X86::BI__builtin_ia32_kxorqi:
767817
case X86::BI__builtin_ia32_kxorhi:
768818
case X86::BI__builtin_ia32_kxorsi:
769819
case X86::BI__builtin_ia32_kxordi:
820+
return emitX86MaskLogic(builder, getLoc(expr->getExprLoc()),
821+
cir::BinOpKind::Xor, ops);
770822
case X86::BI__builtin_ia32_knotqi:
771823
case X86::BI__builtin_ia32_knothi:
772824
case X86::BI__builtin_ia32_knotsi:
773-
case X86::BI__builtin_ia32_knotdi:
825+
case X86::BI__builtin_ia32_knotdi: {
826+
cir::IntType intTy = cast<cir::IntType>(ops[0].getType());
827+
unsigned numElts = intTy.getWidth();
828+
mlir::Value resVec =
829+
getMaskVecValue(builder, getLoc(expr->getExprLoc()), ops[0], numElts);
830+
return builder.createBitcast(builder.createNot(resVec), ops[0].getType());
831+
}
774832
case X86::BI__builtin_ia32_kmovb:
775833
case X86::BI__builtin_ia32_kmovw:
776834
case X86::BI__builtin_ia32_kmovd:
777-
case X86::BI__builtin_ia32_kmovq:
835+
case X86::BI__builtin_ia32_kmovq: {
836+
// Bitcast to vXi1 type and then back to integer. This gets the mask
837+
// register type into the IR, but might be optimized out depending on
838+
// what's around it.
839+
cir::IntType intTy = cast<cir::IntType>(ops[0].getType());
840+
unsigned numElts = intTy.getWidth();
841+
mlir::Value resVec =
842+
getMaskVecValue(builder, getLoc(expr->getExprLoc()), ops[0], numElts);
843+
return builder.createBitcast(resVec, ops[0].getType());
844+
}
778845
case X86::BI__builtin_ia32_kunpckdi:
779846
case X86::BI__builtin_ia32_kunpcksi:
780847
case X86::BI__builtin_ia32_kunpckhi:

clang/lib/CodeGen/Targets/Sparc.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,39 @@ class SparcV8ABIInfo : public DefaultABIInfo {
2626

2727
private:
2828
ABIArgInfo classifyReturnType(QualType RetTy) const;
29+
ABIArgInfo classifyArgumentType(QualType Ty) const;
2930
void computeInfo(CGFunctionInfo &FI) const override;
3031
};
3132
} // end anonymous namespace
3233

34+
ABIArgInfo SparcV8ABIInfo::classifyReturnType(QualType Ty) const {
35+
const auto *CT = Ty->getAs<ComplexType>();
36+
const auto *BT = Ty->getAs<BuiltinType>();
37+
if (CT)
38+
BT = CT->getElementType()->getAs<BuiltinType>();
39+
bool IsLongDouble = BT && BT->getKind() == BuiltinType::LongDouble;
3340

34-
ABIArgInfo
35-
SparcV8ABIInfo::classifyReturnType(QualType Ty) const {
36-
if (Ty->isAnyComplexType()) {
37-
return ABIArgInfo::getDirect();
38-
}
39-
else {
40-
return DefaultABIInfo::classifyReturnType(Ty);
41-
}
41+
// long double _Complex is special in that it should be marked as inreg.
42+
if (CT)
43+
return IsLongDouble ? ABIArgInfo::getDirectInReg()
44+
: ABIArgInfo::getDirect();
45+
46+
if (IsLongDouble)
47+
return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace(),
48+
/*ByVal=*/false);
49+
50+
return DefaultABIInfo::classifyReturnType(Ty);
4251
}
4352

44-
void SparcV8ABIInfo::computeInfo(CGFunctionInfo &FI) const {
53+
ABIArgInfo SparcV8ABIInfo::classifyArgumentType(QualType Ty) const {
54+
if (const auto *BT = Ty->getAs<BuiltinType>();
55+
BT && BT->getKind() == BuiltinType::LongDouble)
56+
return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace());
4557

58+
return DefaultABIInfo::classifyArgumentType(Ty);
59+
}
60+
61+
void SparcV8ABIInfo::computeInfo(CGFunctionInfo &FI) const {
4662
FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4763
for (auto &Arg : FI.arguments())
4864
Arg.info = classifyArgumentType(Arg.type);

0 commit comments

Comments
 (0)