Skip to content

Commit fca5bc0

Browse files
committed
[CIR] [CodeGen] Implement unary floating point builtins
1 parent 8ce2153 commit fca5bc0

File tree

3 files changed

+641
-40
lines changed

3 files changed

+641
-40
lines changed

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

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,29 +2386,33 @@ def IterEndOp : CIR_Op<"iterator_end"> {
23862386
}
23872387

23882388
//===----------------------------------------------------------------------===//
2389-
// FAbsOp
2389+
// Floating Point Ops
23902390
//===----------------------------------------------------------------------===//
23912391

2392-
def FAbsOp : CIR_Op<"fabs", [Pure, SameOperandsAndResultType]> {
2392+
class UnaryFPToFPBuiltinOp<string mnemonic>
2393+
: CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> {
23932394
let arguments = (ins AnyFloat:$src);
23942395
let results = (outs AnyFloat:$result);
2395-
let summary = "Returns absolute value for floating-point input.";
2396-
let description = [{
2397-
Equivalent to libc's `fabs` and LLVM's intrinsic with the same name.
2398-
2399-
Examples:
2400-
2401-
```mlir
2402-
%1 = cir.const(1.0 : f64) : f64
2403-
%2 = cir.fabs %1 : f64
2404-
```
2405-
}];
2406-
2407-
let assemblyFormat = [{
2408-
$src `:` type($src) attr-dict
2409-
}];
2410-
let hasVerifier = 0;
2411-
}
2396+
let summary = "libc builtin equivalent ignoring "
2397+
"floating point exceptions and errno";
2398+
let assemblyFormat = "$src `:` type($src) attr-dict";
2399+
}
2400+
2401+
def CeilOp : UnaryFPToFPBuiltinOp<"ceil">;
2402+
def CosOp : UnaryFPToFPBuiltinOp<"cos">;
2403+
def ExpOp : UnaryFPToFPBuiltinOp<"exp">;
2404+
def Exp2Op : UnaryFPToFPBuiltinOp<"exp2">;
2405+
def FloorOp : UnaryFPToFPBuiltinOp<"floor">;
2406+
def FAbsOp : UnaryFPToFPBuiltinOp<"fabs">;
2407+
def LogOp : UnaryFPToFPBuiltinOp<"log">;
2408+
def Log10Op : UnaryFPToFPBuiltinOp<"log10">;
2409+
def Log2Op : UnaryFPToFPBuiltinOp<"log2">;
2410+
def NearbyintOp : UnaryFPToFPBuiltinOp<"nearbyint">;
2411+
def RintOp : UnaryFPToFPBuiltinOp<"rint">;
2412+
def RoundOp : UnaryFPToFPBuiltinOp<"round">;
2413+
def SinOp : UnaryFPToFPBuiltinOp<"sin">;
2414+
def SqrtOp : UnaryFPToFPBuiltinOp<"sqrt">;
2415+
def TruncOp : UnaryFPToFPBuiltinOp<"trunc">;
24122416

24132417
//===----------------------------------------------------------------------===//
24142418
// Variadic Operations

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) {
@@ -98,7 +111,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
98111
case Builtin::BI__builtin_ceilf16:
99112
case Builtin::BI__builtin_ceill:
100113
case Builtin::BI__builtin_ceilf128:
101-
llvm_unreachable("NYI");
114+
return buildUnaryFPBuiltin<mlir::cir::CeilOp>(*this, *E);
102115

103116
case Builtin::BIcopysign:
104117
case Builtin::BIcopysignf:
@@ -118,7 +131,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
118131
case Builtin::BI__builtin_cosf16:
119132
case Builtin::BI__builtin_cosl:
120133
case Builtin::BI__builtin_cosf128:
121-
llvm_unreachable("NYI");
134+
return buildUnaryFPBuiltin<mlir::cir::CosOp>(*this, *E);
122135

123136
case Builtin::BIexp:
124137
case Builtin::BIexpf:
@@ -128,7 +141,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
128141
case Builtin::BI__builtin_expf16:
129142
case Builtin::BI__builtin_expl:
130143
case Builtin::BI__builtin_expf128:
131-
llvm_unreachable("NYI");
144+
return buildUnaryFPBuiltin<mlir::cir::ExpOp>(*this, *E);
132145

133146
case Builtin::BIexp2:
134147
case Builtin::BIexp2f:
@@ -138,7 +151,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
138151
case Builtin::BI__builtin_exp2f16:
139152
case Builtin::BI__builtin_exp2l:
140153
case Builtin::BI__builtin_exp2f128:
141-
llvm_unreachable("NYI");
154+
return buildUnaryFPBuiltin<mlir::cir::Exp2Op>(*this, *E);
142155

143156
case Builtin::BIfabs:
144157
case Builtin::BIfabsf:
@@ -147,13 +160,8 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
147160
case Builtin::BI__builtin_fabsf:
148161
case Builtin::BI__builtin_fabsf16:
149162
case Builtin::BI__builtin_fabsl:
150-
case Builtin::BI__builtin_fabsf128: {
151-
mlir::Value Src0 = buildScalarExpr(E->getArg(0));
152-
auto SrcType = Src0.getType();
153-
auto Call =
154-
builder.create<mlir::cir::FAbsOp>(Src0.getLoc(), SrcType, Src0);
155-
return RValue::get(Call->getResult(0));
156-
}
163+
case Builtin::BI__builtin_fabsf128:
164+
return buildUnaryFPBuiltin<mlir::cir::FAbsOp>(*this, *E);
157165

158166
case Builtin::BIfloor:
159167
case Builtin::BIfloorf:
@@ -163,7 +171,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
163171
case Builtin::BI__builtin_floorf16:
164172
case Builtin::BI__builtin_floorl:
165173
case Builtin::BI__builtin_floorf128:
166-
llvm_unreachable("NYI");
174+
return buildUnaryFPBuiltin<mlir::cir::FloorOp>(*this, *E);
167175

168176
case Builtin::BIfma:
169177
case Builtin::BIfmaf:
@@ -216,7 +224,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
216224
case Builtin::BI__builtin_logf16:
217225
case Builtin::BI__builtin_logl:
218226
case Builtin::BI__builtin_logf128:
219-
llvm_unreachable("NYI");
227+
return buildUnaryFPBuiltin<mlir::cir::LogOp>(*this, *E);
220228

221229
case Builtin::BIlog10:
222230
case Builtin::BIlog10f:
@@ -226,7 +234,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
226234
case Builtin::BI__builtin_log10f16:
227235
case Builtin::BI__builtin_log10l:
228236
case Builtin::BI__builtin_log10f128:
229-
llvm_unreachable("NYI");
237+
return buildUnaryFPBuiltin<mlir::cir::Log10Op>(*this, *E);
230238

231239
case Builtin::BIlog2:
232240
case Builtin::BIlog2f:
@@ -236,7 +244,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
236244
case Builtin::BI__builtin_log2f16:
237245
case Builtin::BI__builtin_log2l:
238246
case Builtin::BI__builtin_log2f128:
239-
llvm_unreachable("NYI");
247+
return buildUnaryFPBuiltin<mlir::cir::Log2Op>(*this, *E);
240248

241249
case Builtin::BInearbyint:
242250
case Builtin::BInearbyintf:
@@ -245,7 +253,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
245253
case Builtin::BI__builtin_nearbyintf:
246254
case Builtin::BI__builtin_nearbyintl:
247255
case Builtin::BI__builtin_nearbyintf128:
248-
llvm_unreachable("NYI");
256+
return buildUnaryFPBuiltin<mlir::cir::NearbyintOp>(*this, *E);
249257

250258
case Builtin::BIpow:
251259
case Builtin::BIpowf:
@@ -265,7 +273,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
265273
case Builtin::BI__builtin_rintf16:
266274
case Builtin::BI__builtin_rintl:
267275
case Builtin::BI__builtin_rintf128:
268-
llvm_unreachable("NYI");
276+
return buildUnaryFPBuiltin<mlir::cir::RintOp>(*this, *E);
269277

270278
case Builtin::BIround:
271279
case Builtin::BIroundf:
@@ -275,7 +283,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
275283
case Builtin::BI__builtin_roundf16:
276284
case Builtin::BI__builtin_roundl:
277285
case Builtin::BI__builtin_roundf128:
278-
llvm_unreachable("NYI");
286+
return buildUnaryFPBuiltin<mlir::cir::RoundOp>(*this, *E);
279287

280288
case Builtin::BIsin:
281289
case Builtin::BIsinf:
@@ -285,7 +293,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
285293
case Builtin::BI__builtin_sinf16:
286294
case Builtin::BI__builtin_sinl:
287295
case Builtin::BI__builtin_sinf128:
288-
llvm_unreachable("NYI");
296+
return buildUnaryFPBuiltin<mlir::cir::SinOp>(*this, *E);
289297

290298
case Builtin::BIsqrt:
291299
case Builtin::BIsqrtf:
@@ -295,7 +303,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
295303
case Builtin::BI__builtin_sqrtf16:
296304
case Builtin::BI__builtin_sqrtl:
297305
case Builtin::BI__builtin_sqrtf128:
298-
llvm_unreachable("NYI");
306+
return buildUnaryFPBuiltin<mlir::cir::SqrtOp>(*this, *E);
299307

300308
case Builtin::BItrunc:
301309
case Builtin::BItruncf:
@@ -305,7 +313,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
305313
case Builtin::BI__builtin_truncf16:
306314
case Builtin::BI__builtin_truncl:
307315
case Builtin::BI__builtin_truncf128:
308-
llvm_unreachable("NYI");
316+
return buildUnaryFPBuiltin<mlir::cir::TruncOp>(*this, *E);
309317

310318
case Builtin::BIlround:
311319
case Builtin::BIlroundf:

0 commit comments

Comments
 (0)