@@ -1586,7 +1586,6 @@ mlir::LogicalResult CIRToLLVMCmpOpLowering::matchAndRewrite(
1586
1586
assert (!cir::MissingFeatures::dataMemberType ());
1587
1587
assert (!cir::MissingFeatures::methodType ());
1588
1588
1589
- // Lower to LLVM comparison op.
1590
1589
if (mlir::isa<cir::IntType, mlir::IntegerType>(type)) {
1591
1590
bool isSigned = mlir::isa<cir::IntType>(type)
1592
1591
? mlir::cast<cir::IntType>(type).isSigned ()
@@ -1595,22 +1594,82 @@ mlir::LogicalResult CIRToLLVMCmpOpLowering::matchAndRewrite(
1595
1594
convertCmpKindToICmpPredicate (cmpOp.getKind (), isSigned);
1596
1595
rewriter.replaceOpWithNewOp <mlir::LLVM::ICmpOp>(
1597
1596
cmpOp, kind, adaptor.getLhs (), adaptor.getRhs ());
1598
- } else if (auto ptrTy = mlir::dyn_cast<cir::PointerType>(type)) {
1597
+ return mlir::success ();
1598
+ }
1599
+
1600
+ if (auto ptrTy = mlir::dyn_cast<cir::PointerType>(type)) {
1599
1601
mlir::LLVM::ICmpPredicate kind =
1600
1602
convertCmpKindToICmpPredicate (cmpOp.getKind (),
1601
1603
/* isSigned=*/ false );
1602
1604
rewriter.replaceOpWithNewOp <mlir::LLVM::ICmpOp>(
1603
1605
cmpOp, kind, adaptor.getLhs (), adaptor.getRhs ());
1604
- } else if (mlir::isa<cir::FPTypeInterface>(type)) {
1606
+ return mlir::success ();
1607
+ }
1608
+
1609
+ if (mlir::isa<cir::FPTypeInterface>(type)) {
1605
1610
mlir::LLVM::FCmpPredicate kind =
1606
1611
convertCmpKindToFCmpPredicate (cmpOp.getKind ());
1607
1612
rewriter.replaceOpWithNewOp <mlir::LLVM::FCmpOp>(
1608
1613
cmpOp, kind, adaptor.getLhs (), adaptor.getRhs ());
1609
- } else {
1610
- return cmpOp.emitError () << " unsupported type for CmpOp: " << type;
1614
+ return mlir::success ();
1611
1615
}
1612
1616
1613
- return mlir::success ();
1617
+ if (mlir::isa<cir::ComplexType>(type)) {
1618
+ mlir::Value lhs = adaptor.getLhs ();
1619
+ mlir::Value rhs = adaptor.getRhs ();
1620
+ mlir::Location loc = cmpOp.getLoc ();
1621
+
1622
+ auto complexType = mlir::cast<cir::ComplexType>(cmpOp.getLhs ().getType ());
1623
+ mlir::Type complexElemTy =
1624
+ getTypeConverter ()->convertType (complexType.getElementType ());
1625
+
1626
+ auto lhsReal =
1627
+ rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, lhs, 0 );
1628
+ auto lhsImag =
1629
+ rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, lhs, 1 );
1630
+ auto rhsReal =
1631
+ rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, rhs, 0 );
1632
+ auto rhsImag =
1633
+ rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, rhs, 1 );
1634
+
1635
+ if (cmpOp.getKind () == cir::CmpOpKind::eq) {
1636
+ if (complexElemTy.isInteger ()) {
1637
+ auto realCmp = rewriter.create <mlir::LLVM::ICmpOp>(
1638
+ loc, mlir::LLVM::ICmpPredicate::eq, lhsReal, rhsReal);
1639
+ auto imagCmp = rewriter.create <mlir::LLVM::ICmpOp>(
1640
+ loc, mlir::LLVM::ICmpPredicate::eq, lhsImag, rhsImag);
1641
+ rewriter.replaceOpWithNewOp <mlir::LLVM::AndOp>(cmpOp, realCmp, imagCmp);
1642
+ return mlir::success ();
1643
+ }
1644
+
1645
+ auto realCmp = rewriter.create <mlir::LLVM::FCmpOp>(
1646
+ loc, mlir::LLVM::FCmpPredicate::oeq, lhsReal, rhsReal);
1647
+ auto imagCmp = rewriter.create <mlir::LLVM::FCmpOp>(
1648
+ loc, mlir::LLVM::FCmpPredicate::oeq, lhsImag, rhsImag);
1649
+ rewriter.replaceOpWithNewOp <mlir::LLVM::AndOp>(cmpOp, realCmp, imagCmp);
1650
+ return mlir::success ();
1651
+ }
1652
+
1653
+ if (cmpOp.getKind () == cir::CmpOpKind::ne) {
1654
+ if (complexElemTy.isInteger ()) {
1655
+ auto realCmp = rewriter.create <mlir::LLVM::ICmpOp>(
1656
+ loc, mlir::LLVM::ICmpPredicate::ne, lhsReal, rhsReal);
1657
+ auto imagCmp = rewriter.create <mlir::LLVM::ICmpOp>(
1658
+ loc, mlir::LLVM::ICmpPredicate::ne, lhsImag, rhsImag);
1659
+ rewriter.replaceOpWithNewOp <mlir::LLVM::OrOp>(cmpOp, realCmp, imagCmp);
1660
+ return mlir::success ();
1661
+ }
1662
+
1663
+ auto realCmp = rewriter.create <mlir::LLVM::FCmpOp>(
1664
+ loc, mlir::LLVM::FCmpPredicate::une, lhsReal, rhsReal);
1665
+ auto imagCmp = rewriter.create <mlir::LLVM::FCmpOp>(
1666
+ loc, mlir::LLVM::FCmpPredicate::une, lhsImag, rhsImag);
1667
+ rewriter.replaceOpWithNewOp <mlir::LLVM::OrOp>(cmpOp, realCmp, imagCmp);
1668
+ return mlir::success ();
1669
+ }
1670
+ }
1671
+
1672
+ return cmpOp.emitError () << " unsupported type for CmpOp: " << type;
1614
1673
}
1615
1674
1616
1675
mlir::LogicalResult CIRToLLVMShiftOpLowering::matchAndRewrite (
@@ -1901,9 +1960,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
1901
1960
CIRToLLVMCallOpLowering,
1902
1961
CIRToLLVMCmpOpLowering,
1903
1962
CIRToLLVMComplexCreateOpLowering,
1904
- CIRToLLVMComplexEqualOpLowering,
1905
1963
CIRToLLVMComplexImagOpLowering,
1906
- CIRToLLVMComplexNotEqualOpLowering,
1907
1964
CIRToLLVMComplexRealOpLowering,
1908
1965
CIRToLLVMConstantOpLowering,
1909
1966
CIRToLLVMExpectOpLowering,
@@ -2246,80 +2303,6 @@ mlir::LogicalResult CIRToLLVMComplexImagOpLowering::matchAndRewrite(
2246
2303
return mlir::success ();
2247
2304
}
2248
2305
2249
- mlir::LogicalResult CIRToLLVMComplexEqualOpLowering::matchAndRewrite (
2250
- cir::ComplexEqualOp op, OpAdaptor adaptor,
2251
- mlir::ConversionPatternRewriter &rewriter) const {
2252
- mlir::Value lhs = adaptor.getLhs ();
2253
- mlir::Value rhs = adaptor.getRhs ();
2254
-
2255
- auto complexType = mlir::cast<cir::ComplexType>(op.getLhs ().getType ());
2256
- mlir::Type complexElemTy =
2257
- getTypeConverter ()->convertType (complexType.getElementType ());
2258
-
2259
- mlir::Location loc = op.getLoc ();
2260
- auto lhsReal =
2261
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, lhs, 0 );
2262
- auto lhsImag =
2263
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, lhs, 1 );
2264
- auto rhsReal =
2265
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, rhs, 0 );
2266
- auto rhsImag =
2267
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, rhs, 1 );
2268
-
2269
- if (complexElemTy.isInteger ()) {
2270
- auto realCmp = rewriter.create <mlir::LLVM::ICmpOp>(
2271
- loc, mlir::LLVM::ICmpPredicate::eq, lhsReal, rhsReal);
2272
- auto imagCmp = rewriter.create <mlir::LLVM::ICmpOp>(
2273
- loc, mlir::LLVM::ICmpPredicate::eq, lhsImag, rhsImag);
2274
- rewriter.replaceOpWithNewOp <mlir::LLVM::AndOp>(op, realCmp, imagCmp);
2275
- return mlir::success ();
2276
- }
2277
-
2278
- auto realCmp = rewriter.create <mlir::LLVM::FCmpOp>(
2279
- loc, mlir::LLVM::FCmpPredicate::oeq, lhsReal, rhsReal);
2280
- auto imagCmp = rewriter.create <mlir::LLVM::FCmpOp>(
2281
- loc, mlir::LLVM::FCmpPredicate::oeq, lhsImag, rhsImag);
2282
- rewriter.replaceOpWithNewOp <mlir::LLVM::AndOp>(op, realCmp, imagCmp);
2283
- return mlir::success ();
2284
- }
2285
-
2286
- mlir::LogicalResult CIRToLLVMComplexNotEqualOpLowering::matchAndRewrite (
2287
- cir::ComplexNotEqualOp op, OpAdaptor adaptor,
2288
- mlir::ConversionPatternRewriter &rewriter) const {
2289
- mlir::Value lhs = adaptor.getLhs ();
2290
- mlir::Value rhs = adaptor.getRhs ();
2291
-
2292
- auto complexType = mlir::cast<cir::ComplexType>(op.getLhs ().getType ());
2293
- mlir::Type complexElemTy =
2294
- getTypeConverter ()->convertType (complexType.getElementType ());
2295
-
2296
- mlir::Location loc = op.getLoc ();
2297
- auto lhsReal =
2298
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, lhs, 0 );
2299
- auto lhsImag =
2300
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, lhs, 1 );
2301
- auto rhsReal =
2302
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, rhs, 0 );
2303
- auto rhsImag =
2304
- rewriter.create <mlir::LLVM::ExtractValueOp>(loc, complexElemTy, rhs, 1 );
2305
-
2306
- if (complexElemTy.isInteger ()) {
2307
- auto realCmp = rewriter.create <mlir::LLVM::ICmpOp>(
2308
- loc, mlir::LLVM::ICmpPredicate::ne, lhsReal, rhsReal);
2309
- auto imagCmp = rewriter.create <mlir::LLVM::ICmpOp>(
2310
- loc, mlir::LLVM::ICmpPredicate::ne, lhsImag, rhsImag);
2311
- rewriter.replaceOpWithNewOp <mlir::LLVM::OrOp>(op, realCmp, imagCmp);
2312
- return mlir::success ();
2313
- }
2314
-
2315
- auto realCmp = rewriter.create <mlir::LLVM::FCmpOp>(
2316
- loc, mlir::LLVM::FCmpPredicate::une, lhsReal, rhsReal);
2317
- auto imagCmp = rewriter.create <mlir::LLVM::FCmpOp>(
2318
- loc, mlir::LLVM::FCmpPredicate::une, lhsImag, rhsImag);
2319
- rewriter.replaceOpWithNewOp <mlir::LLVM::OrOp>(op, realCmp, imagCmp);
2320
- return mlir::success ();
2321
- }
2322
-
2323
2306
std::unique_ptr<mlir::Pass> createConvertCIRToLLVMPass () {
2324
2307
return std::make_unique<ConvertCIRToLLVMPass>();
2325
2308
}
0 commit comments