================
@@ -326,7 +324,47 @@ class AggExprEmitter : public StmtVisitor<AggExprEmitter> {
     Visit(e->getRHS());
   }
   void VisitBinCmp(const BinaryOperator *e) {
-    cgf.cgm.errorNYI(e->getSourceRange(), "AggExprEmitter: VisitBinCmp");
+    const ComparisonCategoryInfo &CompCategoryInfo =
+        cgf.getContext().CompCategories.getInfoForType(e->getType());
+
+    QualType ArgTy = e->getLHS()->getType();
+    if (ArgTy->isIntegralOrEnumerationType() || ArgTy->isRealFloatingType() ||
+        ArgTy->isNullPtrType() || ArgTy->isPointerType() ||
+        ArgTy->isMemberPointerType()) {
+      mlir::Value lhs = cgf.emitScalarExpr(e->getLHS());
+      mlir::Value rhs = cgf.emitScalarExpr(e->getRHS());
+
+      mlir::Attribute info;
+      if (CompCategoryInfo.isStrong()) {
+        info = cir::CmpThreeWayStrongInfoAttr::get(
+            cgf.getBuilder().getContext(),
+            CompCategoryInfo.getLess()->getIntValue().getSExtValue(),
+            CompCategoryInfo.getEqualOrEquiv()->getIntValue().getSExtValue(),
+            CompCategoryInfo.getGreater()->getIntValue().getSExtValue());
+      } else {
+        info = cir::CmpThreeWayPartialInfoAttr::get(
+            cgf.getBuilder().getContext(),
+            CompCategoryInfo.getLess()->getIntValue().getSExtValue(),
+            CompCategoryInfo.getEqualOrEquiv()->getIntValue().getSExtValue(),
+            CompCategoryInfo.getGreater()->getIntValue().getSExtValue(),
+            CompCategoryInfo.getUnordered()->getIntValue().getSExtValue());
+      }
+      mlir::Type resultTy = cgf.convertType(cgf.getContext().IntTy);
+      mlir::Value result = cgf.getBuilder().createThreeWayComparison(
+          cgf.getLoc(e->getSourceRange()), resultTy, lhs, rhs, info);
+
+      ensureDest(cgf.getLoc(e->getSourceRange()), e->getType());
+      LValue destLValue = cgf.makeAddrLValue(dest.getAddress(), e->getType());
+
+      const FieldDecl *field = *CompCategoryInfo.Record->field_begin();
+      LValue fieldLValue = cgf.emitLValueForFieldInitialization(
+          destLValue, field, field->getName());
+      cgf.emitStoreThroughLValue(RValue::get(result), fieldLValue, true);
+    } else {
+      cgf.cgm.errorNYI(e->getSourceRange(),
+                       "AggExprEmitter: unsupported operand type");
----------------
ZakyHermawan wrote:

Is it possible to provide more information ?
For example, what operand is this.

https://github.com/llvm/llvm-project/pull/186294
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to