From d220ce012915a52327ad445cecd1b69dc1eba2ad Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Thu, 11 Aug 2022 19:53:20 -0400 Subject: [PATCH 1/2] Ensure same fcmp order as clang --- tools/cgeist/Lib/clang-mlir.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/cgeist/Lib/clang-mlir.cc b/tools/cgeist/Lib/clang-mlir.cc index d9f6322cb3d3..bf54ed63be54 100644 --- a/tools/cgeist/Lib/clang-mlir.cc +++ b/tools/cgeist/Lib/clang-mlir.cc @@ -2512,27 +2512,27 @@ ValueCategory MLIRScanner::VisitBinaryOperator(clang::BinaryOperator *BO) { LLVM::ICmpPredicate LPred; switch (BO->getOpcode()) { case clang::BinaryOperator::Opcode::BO_GT: - FPred = CmpFPredicate::UGT; + FPred = CmpFPredicate::OGT; IPred = signedType ? CmpIPredicate::sgt : CmpIPredicate::ugt, LPred = LLVM::ICmpPredicate::ugt; break; case clang::BinaryOperator::Opcode::BO_GE: - FPred = CmpFPredicate::UGE; + FPred = CmpFPredicate::OGE; IPred = signedType ? CmpIPredicate::sge : CmpIPredicate::uge, LPred = LLVM::ICmpPredicate::uge; break; case clang::BinaryOperator::Opcode::BO_LT: - FPred = CmpFPredicate::ULT; + FPred = CmpFPredicate::OLT; IPred = signedType ? CmpIPredicate::slt : CmpIPredicate::ult, LPred = LLVM::ICmpPredicate::ult; break; case clang::BinaryOperator::Opcode::BO_LE: - FPred = CmpFPredicate::ULE; + FPred = CmpFPredicate::OLE; IPred = signedType ? CmpIPredicate::sle : CmpIPredicate::ule, LPred = LLVM::ICmpPredicate::ule; break; case clang::BinaryOperator::Opcode::BO_EQ: - FPred = CmpFPredicate::UEQ; + FPred = CmpFPredicate::OEQ; IPred = CmpIPredicate::eq; LPred = LLVM::ICmpPredicate::eq; break; From c13eafbfe5489e062072800329db37e551b64945 Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Thu, 11 Aug 2022 20:03:04 -0400 Subject: [PATCH 2/2] Fast for break --- lib/polygeist/Passes/ForBreakToWhile.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/polygeist/Passes/ForBreakToWhile.cpp b/lib/polygeist/Passes/ForBreakToWhile.cpp index 5c90a1ba7358..1510083fd3df 100644 --- a/lib/polygeist/Passes/ForBreakToWhile.cpp +++ b/lib/polygeist/Passes/ForBreakToWhile.cpp @@ -82,9 +82,20 @@ struct ForBreakLoweringPattern : public OpRewritePattern { auto *beforeBlock = rewriter.createBlock( &whileOp.getBefore(), whileOp.getBefore().begin(), lcvTypes, lcvLocs); rewriter.setInsertionPointToStart(&whileOp.getBefore().front()); - Value cmpOp = rewriter.create( - whileOp.getLoc(), arith::CmpIPredicate::slt, - beforeBlock->getArgument(0), forOp.getUpperBound()); + Value cmpOp; + if (matchPattern(forOp.getStep(), m_One())) { + cmpOp = rewriter.create( + whileOp.getLoc(), + rewriter.create( + whileOp.getLoc(), arith::CmpIPredicate::ne, + beforeBlock->getArgument(0), forOp.getUpperBound()), + rewriter.create( + whileOp.getLoc(), arith::CmpIPredicate::slt, + forOp.getLowerBound(), forOp.getUpperBound())); + } else + cmpOp = rewriter.create( + whileOp.getLoc(), arith::CmpIPredicate::slt, + beforeBlock->getArgument(0), forOp.getUpperBound()); Value andOp = rewriter.create( whileOp.getLoc(), cmpOp, whileOp.getBeforeArguments()[iterArgPos + 1]); // TODO: consider not forwarding the condition variable.