[clang] [CIR][NFC] Update stale elementwise handler (PR #207530)

via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 4 10:52:41 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clangir

Author: Letu Ren (FantasqueX)

<details>
<summary>Changes</summary>

A follow up of https://github.com/llvm/llvm-project/pull/204974
Clean up stale code of https://github.com/llvm/llvm-project/pull/169424
Add two missing CIR elementwise tests
Add three missing elementwise builtins as NYI

---
Full diff: https://github.com/llvm/llvm-project/pull/207530.diff


2 Files Affected:

- (modified) clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp (+16-61) 
- (modified) clang/test/CIR/CodeGenBuiltins/builtins-elementwise.c (+44) 


``````````diff
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index 425e07715c9f4..2c198fabea9db 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -581,8 +581,8 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_cosf16:
   case Builtin::BI__builtin_cosl:
   case Builtin::BI__builtin_cosf128:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::CosOp>(cgf, *e);
   case Builtin::BI__builtin_elementwise_cos:
+    return emitUnaryMaybeConstrainedFPBuiltin<cir::CosOp>(cgf, *e);
   case Builtin::BIcosh:
   case Builtin::BIcoshf:
   case Builtin::BIcoshl:
@@ -592,7 +592,7 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_coshl:
   case Builtin::BI__builtin_coshf128:
   case Builtin::BI__builtin_elementwise_cosh:
-    return RValue::getIgnored();
+    return errorBuiltinNYI(cgf, e, builtinID);
   case Builtin::BIexp:
   case Builtin::BIexpf:
   case Builtin::BIexpl:
@@ -601,9 +601,8 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_expf16:
   case Builtin::BI__builtin_expl:
   case Builtin::BI__builtin_expf128:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::ExpOp>(cgf, *e);
   case Builtin::BI__builtin_elementwise_exp:
-    return RValue::getIgnored();
+    return emitUnaryMaybeConstrainedFPBuiltin<cir::ExpOp>(cgf, *e);
   case Builtin::BIexp2:
   case Builtin::BIexp2f:
   case Builtin::BIexp2l:
@@ -612,15 +611,15 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_exp2f16:
   case Builtin::BI__builtin_exp2l:
   case Builtin::BI__builtin_exp2f128:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::Exp2Op>(cgf, *e);
   case Builtin::BI__builtin_elementwise_exp2:
+    return emitUnaryMaybeConstrainedFPBuiltin<cir::Exp2Op>(cgf, *e);
   case Builtin::BI__builtin_exp10:
   case Builtin::BI__builtin_exp10f:
   case Builtin::BI__builtin_exp10f16:
   case Builtin::BI__builtin_exp10l:
   case Builtin::BI__builtin_exp10f128:
   case Builtin::BI__builtin_elementwise_exp10:
-    return RValue::getIgnored();
+    return errorBuiltinNYI(cgf, e, builtinID);
   case Builtin::BIfabs:
   case Builtin::BIfabsf:
   case Builtin::BIfabsl:
@@ -638,8 +637,8 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_floorf16:
   case Builtin::BI__builtin_floorl:
   case Builtin::BI__builtin_floorf128:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::FloorOp>(cgf, *e);
   case Builtin::BI__builtin_elementwise_floor:
+    return emitUnaryMaybeConstrainedFPBuiltin<cir::FloorOp>(cgf, *e);
   case Builtin::BIfma:
   case Builtin::BIfmaf:
   case Builtin::BIfmal:
@@ -649,7 +648,7 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_fmal:
   case Builtin::BI__builtin_fmaf128:
   case Builtin::BI__builtin_elementwise_fma:
-    return RValue::getIgnored();
+    return errorBuiltinNYI(cgf, e, builtinID);
   case Builtin::BIfmax:
   case Builtin::BIfmaxf:
   case Builtin::BIfmaxl:
@@ -686,7 +685,7 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_fminimum_numf16:
   case Builtin::BI__builtin_fminimum_numl:
   case Builtin::BI__builtin_fminimum_numf128:
-    return RValue::getIgnored();
+    return errorBuiltinNYI(cgf, e, builtinID);
   case Builtin::BIfmod:
   case Builtin::BIfmodf:
   case Builtin::BIfmodl:
@@ -748,7 +747,7 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
     return RValue::get(
         emitBinaryMaybeConstrainedFPBuiltin<cir::PowOp>(cgf, *e));
   case Builtin::BI__builtin_elementwise_pow:
-    return RValue::getIgnored();
+    return errorBuiltinNYI(cgf, e, builtinID);
   case Builtin::BIrint:
   case Builtin::BIrintf:
   case Builtin::BIrintl:
@@ -809,7 +808,7 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_sincosf16:
   case Builtin::BI__builtin_sincosl:
   case Builtin::BI__builtin_sincosf128:
-    return RValue::getIgnored();
+    return errorBuiltinNYI(cgf, e, builtinID);
   case Builtin::BIsqrt:
   case Builtin::BIsqrtf:
   case Builtin::BIsqrtl:
@@ -839,7 +838,7 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_tanhl:
   case Builtin::BI__builtin_tanhf128:
   case Builtin::BI__builtin_elementwise_tanh:
-    return RValue::getIgnored();
+    return errorBuiltinNYI(cgf, e, builtinID);
   case Builtin::BItrunc:
   case Builtin::BItruncf:
   case Builtin::BItruncl:
@@ -888,6 +887,7 @@ static RValue tryEmitFPMathIntrinsic(CIRGenFunction &cgf, const CallExpr *e,
   case Builtin::BI__builtin_ldexpf16:
   case Builtin::BI__builtin_ldexpf128:
   case Builtin::BI__builtin_elementwise_ldexp:
+    return errorBuiltinNYI(cgf, e, builtinID);
   default:
     break;
   }
@@ -1653,59 +1653,10 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
                                             arg.getType(), arg, false);
     return RValue::get(result);
   }
-  case Builtin::BI__builtin_elementwise_acos:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::ACosOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_asin:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::ASinOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_atan:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::ATanOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_atan2:
-    return RValue::get(
-        emitBinaryMaybeConstrainedFPBuiltin<cir::ATan2Op>(*this, *e));
-  case Builtin::BI__builtin_elementwise_exp:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::ExpOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_exp2:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::Exp2Op>(*this, *e);
-  case Builtin::BI__builtin_elementwise_log:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::LogOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_log2:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::Log2Op>(*this, *e);
-  case Builtin::BI__builtin_elementwise_log10:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::Log10Op>(*this, *e);
-  case Builtin::BI__builtin_elementwise_cos:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::CosOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_floor:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::FloorOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_round:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::RoundOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_rint:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::RintOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_nearbyint:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::NearbyintOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_sin:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::SinOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_sqrt:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::SqrtOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_tan:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::TanOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_trunc:
-    return emitUnaryMaybeConstrainedFPBuiltin<cir::TruncOp>(*this, *e);
-  case Builtin::BI__builtin_elementwise_fmod:
-    return RValue::get(
-        emitBinaryMaybeConstrainedFPBuiltin<cir::FModOp>(*this, *e));
-  case Builtin::BI__builtin_elementwise_ceil:
-  case Builtin::BI__builtin_elementwise_exp10:
-  case Builtin::BI__builtin_elementwise_ldexp:
-  case Builtin::BI__builtin_elementwise_pow:
   case Builtin::BI__builtin_elementwise_bitreverse:
-  case Builtin::BI__builtin_elementwise_cosh:
   case Builtin::BI__builtin_elementwise_popcount:
-  case Builtin::BI__builtin_elementwise_roundeven:
-  case Builtin::BI__builtin_elementwise_sinh:
-  case Builtin::BI__builtin_elementwise_tanh:
   case Builtin::BI__builtin_elementwise_canonicalize:
   case Builtin::BI__builtin_elementwise_copysign:
-  case Builtin::BI__builtin_elementwise_fma:
     return errorBuiltinNYI(*this, e, builtinID);
   case Builtin::BI__builtin_elementwise_fshl: {
     mlir::Location loc = getLoc(e->getExprLoc());
@@ -1723,6 +1674,10 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
     return RValue::get(builder.emitIntrinsicCallOp(loc, "fshr", a.getType(),
                                                    mlir::ValueRange{a, b, c}));
   }
+  case Builtin::BI__builtin_elementwise_clmul:
+  case Builtin::BI__builtin_elementwise_pext:
+  case Builtin::BI__builtin_elementwise_pdep:
+    return errorBuiltinNYI(*this, e, builtinID);
   case Builtin::BI__builtin_elementwise_add_sat:
   case Builtin::BI__builtin_elementwise_sub_sat: {
     // cir.add/cir.sub do not model i1 arithmetic, so a bool-element
diff --git a/clang/test/CIR/CodeGenBuiltins/builtins-elementwise.c b/clang/test/CIR/CodeGenBuiltins/builtins-elementwise.c
index 07cdedfe23aa1..442ecdaa7faf1 100644
--- a/clang/test/CIR/CodeGenBuiltins/builtins-elementwise.c
+++ b/clang/test/CIR/CodeGenBuiltins/builtins-elementwise.c
@@ -306,6 +306,50 @@ void test_builtin_elementwise_floor(float f, double d, vfloat4 vf4,
   vd4 = __builtin_elementwise_floor(vd4);
 }
 
+void test_builtin_elementwise_fmod(float f, double d, vfloat4 vf4,
+                                   vdouble4 vd4) {
+  // CIR-LABEL: test_builtin_elementwise_fmod
+  // LLVM-LABEL: test_builtin_elementwise_fmod
+
+  // CIR: cir.fmod %{{.*}}, %{{.*}} : !cir.float
+  // LLVM: frem float %{{.*}}, %{{.*}}
+  f = __builtin_elementwise_fmod(f, f);
+
+  // CIR: cir.fmod %{{.*}}, %{{.*}} : !cir.double
+  // LLVM: frem double %{{.*}}, %{{.*}}
+  d = __builtin_elementwise_fmod(d, d);
+
+  // CIR: cir.fmod %{{.*}}, %{{.*}} : !cir.vector<4 x !cir.float>
+  // LLVM: frem <4 x float> %{{.*}}, %{{.*}}
+  vf4 = __builtin_elementwise_fmod(vf4, vf4);
+
+  // CIR: cir.fmod %{{.*}}, %{{.*}} : !cir.vector<4 x !cir.double>
+  // LLVM: frem <4 x double> %{{.*}}, %{{.*}}
+  vd4 = __builtin_elementwise_fmod(vd4, vd4);
+}
+
+void test_builtin_elementwise_roundeven(float f, double d, vfloat4 vf4,
+                                        vdouble4 vd4) {
+  // CIR-LABEL: test_builtin_elementwise_roundeven
+  // LLVM-LABEL: test_builtin_elementwise_roundeven
+
+  // CIR: cir.roundeven %{{.*}} : !cir.float
+  // LLVM: call float @llvm.roundeven.f32(float %{{.*}})
+  f = __builtin_elementwise_roundeven(f);
+
+  // CIR: cir.roundeven %{{.*}} : !cir.double
+  // LLVM: call double @llvm.roundeven.f64(double %{{.*}})
+  d = __builtin_elementwise_roundeven(d);
+
+  // CIR: cir.roundeven %{{.*}} : !cir.vector<4 x !cir.float>
+  // LLVM: call <4 x float> @llvm.roundeven.v4f32(<4 x float> %{{.*}})
+  vf4 = __builtin_elementwise_roundeven(vf4);
+
+  // CIR: cir.roundeven %{{.*}} : !cir.vector<4 x !cir.double>
+  // LLVM: call <4 x double> @llvm.roundeven.v4f64(<4 x double> %{{.*}})
+  vd4 = __builtin_elementwise_roundeven(vd4);
+}
+
 void test_builtin_elementwise_round(float f, double d, vfloat4 vf4,
                    vdouble4 vd4) {
   // CIR-LABEL: test_builtin_elementwise_round

``````````

</details>


https://github.com/llvm/llvm-project/pull/207530


More information about the cfe-commits mailing list