Skip to content

Commit b9668c2

Browse files
committed
[CIR] [CodeGen] Implement unary floating point builtins
1 parent 3adad6b commit b9668c2

File tree

3 files changed

+657
-56
lines changed

3 files changed

+657
-56
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,13 +1447,13 @@ def VTableAddrPointOp : CIR_Op<"vtable.address_point",
14471447

14481448
def SetBitfieldOp : CIR_Op<"set_bitfield"> {
14491449
let summary = "Set a bitfield";
1450-
let description = [{
1451-
The `cir.set_bitfield` operation provides a store-like access to
1450+
let description = [{
1451+
The `cir.set_bitfield` operation provides a store-like access to
14521452
a bit field of a record.
14531453

14541454
It expects an address of a storage where to store, a type of the storage,
14551455
a value being stored, a name of a bit field, a pointer to the storage in the
1456-
base record, a size of the storage, a size the bit field, an offset
1456+
base record, a size of the storage, a size the bit field, an offset
14571457
of the bit field and a sign. Returns a value being stored.
14581458

14591459
Example.
@@ -1496,20 +1496,20 @@ def SetBitfieldOp : CIR_Op<"set_bitfield"> {
14961496

14971497
let assemblyFormat = [{ `(`$bitfield_info`,` $dst`:`type($dst)`,`
14981498
$src`:`type($src) `)` attr-dict `->` type($result) }];
1499-
1499+
15001500
let builders = [
15011501
OpBuilder<(ins "Type":$type,
15021502
"Value":$dst,
15031503
"Type":$storage_type,
15041504
"Value":$src,
15051505
"StringRef":$name,
1506-
"unsigned":$size,
1506+
"unsigned":$size,
15071507
"unsigned":$offset,
15081508
"bool":$is_signed
15091509
),
1510-
[{
1511-
BitfieldInfoAttr info =
1512-
BitfieldInfoAttr::get($_builder.getContext(),
1510+
[{
1511+
BitfieldInfoAttr info =
1512+
BitfieldInfoAttr::get($_builder.getContext(),
15131513
name, storage_type,
15141514
size, offset, is_signed);
15151515
build($_builder, $_state, type, dst, src, info);
@@ -1523,7 +1523,7 @@ def SetBitfieldOp : CIR_Op<"set_bitfield"> {
15231523

15241524
def GetBitfieldOp : CIR_Op<"get_bitfield"> {
15251525
let summary = "Get a bitfield";
1526-
let description = [{
1526+
let description = [{
15271527
The `cir.get_bitfield` operation provides a load-like access to
15281528
a bit field of a record.
15291529

@@ -1561,13 +1561,13 @@ def GetBitfieldOp : CIR_Op<"get_bitfield"> {
15611561
}];
15621562

15631563
let arguments = (ins
1564-
AnyType:$addr,
1564+
AnyType:$addr,
15651565
BitfieldInfoAttr:$bitfield_info
15661566
);
15671567

15681568
let results = (outs CIR_IntType:$result);
15691569

1570-
let assemblyFormat = [{ `(`$bitfield_info `,` $addr attr-dict `:`
1570+
let assemblyFormat = [{ `(`$bitfield_info `,` $addr attr-dict `:`
15711571
type($addr) `)` `->` type($result) }];
15721572

15731573
let builders = [
@@ -1580,8 +1580,8 @@ def GetBitfieldOp : CIR_Op<"get_bitfield"> {
15801580
"bool":$is_signed
15811581
),
15821582
[{
1583-
BitfieldInfoAttr info =
1584-
BitfieldInfoAttr::get($_builder.getContext(),
1583+
BitfieldInfoAttr info =
1584+
BitfieldInfoAttr::get($_builder.getContext(),
15851585
name, storage_type,
15861586
size, offset, is_signed);
15871587
build($_builder, $_state, type, addr, info);
@@ -2367,29 +2367,33 @@ def IterEndOp : CIR_Op<"iterator_end"> {
23672367
}
23682368

23692369
//===----------------------------------------------------------------------===//
2370-
// FAbsOp
2370+
// Floating Point Ops
23712371
//===----------------------------------------------------------------------===//
23722372

2373-
def FAbsOp : CIR_Op<"fabs", [Pure, SameOperandsAndResultType]> {
2373+
class UnaryFPToFPBuiltinOp<string mnemonic>
2374+
: CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> {
23742375
let arguments = (ins AnyFloat:$src);
23752376
let results = (outs AnyFloat:$result);
2376-
let summary = "Returns absolute value for floating-point input.";
2377-
let description = [{
2378-
Equivalent to libc's `fabs` and LLVM's intrinsic with the same name.
2379-
2380-
Examples:
2381-
2382-
```mlir
2383-
%1 = cir.const(1.0 : f64) : f64
2384-
%2 = cir.fabs %1 : f64
2385-
```
2386-
}];
2387-
2388-
let assemblyFormat = [{
2389-
$src `:` type($src) attr-dict
2390-
}];
2391-
let hasVerifier = 0;
2392-
}
2377+
let summary = "libc builtin equivalent ignoring "
2378+
"floating point exceptions and errno";
2379+
let assemblyFormat = "$src `:` type($src) attr-dict";
2380+
}
2381+
2382+
def CeilOp : UnaryFPToFPBuiltinOp<"ceil">;
2383+
def CosOp : UnaryFPToFPBuiltinOp<"cos">;
2384+
def ExpOp : UnaryFPToFPBuiltinOp<"exp">;
2385+
def Exp2Op : UnaryFPToFPBuiltinOp<"exp2">;
2386+
def FloorOp : UnaryFPToFPBuiltinOp<"floor">;
2387+
def FAbsOp : UnaryFPToFPBuiltinOp<"fabs">;
2388+
def LogOp : UnaryFPToFPBuiltinOp<"log">;
2389+
def Log10Op : UnaryFPToFPBuiltinOp<"log10">;
2390+
def Log2Op : UnaryFPToFPBuiltinOp<"log2">;
2391+
def NearbyintOp : UnaryFPToFPBuiltinOp<"nearbyint">;
2392+
def RintOp : UnaryFPToFPBuiltinOp<"rint">;
2393+
def RoundOp : UnaryFPToFPBuiltinOp<"round">;
2394+
def SinOp : UnaryFPToFPBuiltinOp<"sin">;
2395+
def SqrtOp : UnaryFPToFPBuiltinOp<"sqrt">;
2396+
def TruncOp : UnaryFPToFPBuiltinOp<"trunc">;
23932397

23942398
//===----------------------------------------------------------------------===//
23952399
// Variadic Operations
@@ -2593,19 +2597,19 @@ def CIR_InlineAsmOp : CIR_Op<"asm", [RecursiveMemoryEffects]> {
25932597

25942598
```
25952599
```mlir
2596-
cir.asm(x86_att, {"xyz"}) -> !void
2600+
cir.asm(x86_att, {"xyz"}) -> !void
25972601
```
25982602
}];
25992603

26002604
let results = (outs Optional<AnyType>:$res);
26012605

26022606
let arguments = (
26032607
ins StrAttr:$asm_string,
2604-
AsmFlavor:$asm_flavor);
2608+
AsmFlavor:$asm_flavor);
26052609

26062610
let assemblyFormat = [{
26072611
`(`$asm_flavor`,` `{` $asm_string `}` `)` attr-dict `:` type($res)
2608-
}];
2612+
}];
26092613
}
26102614

26112615
#endif // MLIR_CIR_DIALECT_CIR_OPS

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@ static RValue buildLibraryCall(CIRGenFunction &CGF, const FunctionDecl *FD,
4242
return CGF.buildCall(E->getCallee()->getType(), callee, E, ReturnValueSlot());
4343
}
4444

45+
template <class Operation>
46+
static RValue buildUnaryFPBuiltin(CIRGenFunction &CGF, const CallExpr &E) {
47+
auto Arg = CGF.buildScalarExpr(E.getArg(0));
48+
49+
CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(CGF, &E);
50+
if (CGF.getBuilder().getIsFPConstrained())
51+
llvm_unreachable("constraint FP operations are NYI");
52+
53+
auto Call =
54+
CGF.getBuilder().create<Operation>(Arg.getLoc(), Arg.getType(), Arg);
55+
return RValue::get(Call->getResult(0));
56+
}
57+
4558
RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
4659
const CallExpr *E,
4760
ReturnValueSlot ReturnValue) {
@@ -93,7 +106,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
93106
case Builtin::BI__builtin_ceilf16:
94107
case Builtin::BI__builtin_ceill:
95108
case Builtin::BI__builtin_ceilf128:
96-
llvm_unreachable("NYI");
109+
return buildUnaryFPBuiltin<mlir::cir::CeilOp>(*this, *E);
97110

98111
case Builtin::BIcopysign:
99112
case Builtin::BIcopysignf:
@@ -113,7 +126,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
113126
case Builtin::BI__builtin_cosf16:
114127
case Builtin::BI__builtin_cosl:
115128
case Builtin::BI__builtin_cosf128:
116-
llvm_unreachable("NYI");
129+
return buildUnaryFPBuiltin<mlir::cir::CosOp>(*this, *E);
117130

118131
case Builtin::BIexp:
119132
case Builtin::BIexpf:
@@ -123,7 +136,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
123136
case Builtin::BI__builtin_expf16:
124137
case Builtin::BI__builtin_expl:
125138
case Builtin::BI__builtin_expf128:
126-
llvm_unreachable("NYI");
139+
return buildUnaryFPBuiltin<mlir::cir::ExpOp>(*this, *E);
127140

128141
case Builtin::BIexp2:
129142
case Builtin::BIexp2f:
@@ -133,7 +146,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
133146
case Builtin::BI__builtin_exp2f16:
134147
case Builtin::BI__builtin_exp2l:
135148
case Builtin::BI__builtin_exp2f128:
136-
llvm_unreachable("NYI");
149+
return buildUnaryFPBuiltin<mlir::cir::Exp2Op>(*this, *E);
137150

138151
case Builtin::BIfabs:
139152
case Builtin::BIfabsf:
@@ -142,13 +155,8 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
142155
case Builtin::BI__builtin_fabsf:
143156
case Builtin::BI__builtin_fabsf16:
144157
case Builtin::BI__builtin_fabsl:
145-
case Builtin::BI__builtin_fabsf128: {
146-
mlir::Value Src0 = buildScalarExpr(E->getArg(0));
147-
auto SrcType = Src0.getType();
148-
auto Call =
149-
builder.create<mlir::cir::FAbsOp>(Src0.getLoc(), SrcType, Src0);
150-
return RValue::get(Call->getResult(0));
151-
}
158+
case Builtin::BI__builtin_fabsf128:
159+
return buildUnaryFPBuiltin<mlir::cir::FAbsOp>(*this, *E);
152160

153161
case Builtin::BIfloor:
154162
case Builtin::BIfloorf:
@@ -158,7 +166,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
158166
case Builtin::BI__builtin_floorf16:
159167
case Builtin::BI__builtin_floorl:
160168
case Builtin::BI__builtin_floorf128:
161-
llvm_unreachable("NYI");
169+
return buildUnaryFPBuiltin<mlir::cir::FloorOp>(*this, *E);
162170

163171
case Builtin::BIfma:
164172
case Builtin::BIfmaf:
@@ -211,7 +219,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
211219
case Builtin::BI__builtin_logf16:
212220
case Builtin::BI__builtin_logl:
213221
case Builtin::BI__builtin_logf128:
214-
llvm_unreachable("NYI");
222+
return buildUnaryFPBuiltin<mlir::cir::LogOp>(*this, *E);
215223

216224
case Builtin::BIlog10:
217225
case Builtin::BIlog10f:
@@ -221,7 +229,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
221229
case Builtin::BI__builtin_log10f16:
222230
case Builtin::BI__builtin_log10l:
223231
case Builtin::BI__builtin_log10f128:
224-
llvm_unreachable("NYI");
232+
return buildUnaryFPBuiltin<mlir::cir::Log10Op>(*this, *E);
225233

226234
case Builtin::BIlog2:
227235
case Builtin::BIlog2f:
@@ -231,7 +239,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
231239
case Builtin::BI__builtin_log2f16:
232240
case Builtin::BI__builtin_log2l:
233241
case Builtin::BI__builtin_log2f128:
234-
llvm_unreachable("NYI");
242+
return buildUnaryFPBuiltin<mlir::cir::Log2Op>(*this, *E);
235243

236244
case Builtin::BInearbyint:
237245
case Builtin::BInearbyintf:
@@ -240,7 +248,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
240248
case Builtin::BI__builtin_nearbyintf:
241249
case Builtin::BI__builtin_nearbyintl:
242250
case Builtin::BI__builtin_nearbyintf128:
243-
llvm_unreachable("NYI");
251+
return buildUnaryFPBuiltin<mlir::cir::NearbyintOp>(*this, *E);
244252

245253
case Builtin::BIpow:
246254
case Builtin::BIpowf:
@@ -260,7 +268,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
260268
case Builtin::BI__builtin_rintf16:
261269
case Builtin::BI__builtin_rintl:
262270
case Builtin::BI__builtin_rintf128:
263-
llvm_unreachable("NYI");
271+
return buildUnaryFPBuiltin<mlir::cir::RintOp>(*this, *E);
264272

265273
case Builtin::BIround:
266274
case Builtin::BIroundf:
@@ -270,7 +278,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
270278
case Builtin::BI__builtin_roundf16:
271279
case Builtin::BI__builtin_roundl:
272280
case Builtin::BI__builtin_roundf128:
273-
llvm_unreachable("NYI");
281+
return buildUnaryFPBuiltin<mlir::cir::RoundOp>(*this, *E);
274282

275283
case Builtin::BIsin:
276284
case Builtin::BIsinf:
@@ -280,7 +288,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
280288
case Builtin::BI__builtin_sinf16:
281289
case Builtin::BI__builtin_sinl:
282290
case Builtin::BI__builtin_sinf128:
283-
llvm_unreachable("NYI");
291+
return buildUnaryFPBuiltin<mlir::cir::SinOp>(*this, *E);
284292

285293
case Builtin::BIsqrt:
286294
case Builtin::BIsqrtf:
@@ -290,7 +298,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
290298
case Builtin::BI__builtin_sqrtf16:
291299
case Builtin::BI__builtin_sqrtl:
292300
case Builtin::BI__builtin_sqrtf128:
293-
llvm_unreachable("NYI");
301+
return buildUnaryFPBuiltin<mlir::cir::SqrtOp>(*this, *E);
294302

295303
case Builtin::BItrunc:
296304
case Builtin::BItruncf:
@@ -300,7 +308,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
300308
case Builtin::BI__builtin_truncf16:
301309
case Builtin::BI__builtin_truncl:
302310
case Builtin::BI__builtin_truncf128:
303-
llvm_unreachable("NYI");
311+
return buildUnaryFPBuiltin<mlir::cir::TruncOp>(*this, *E);
304312

305313
case Builtin::BIlround:
306314
case Builtin::BIlroundf:

0 commit comments

Comments
 (0)