@@ -784,6 +784,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
784784 const auto ® = step.args [0 ];
785785 assert (reg.first == Compiler::StaticType::Number);
786786 llvm::Value *count = castValue (reg.second , reg.first );
787+ llvm::Value *isInf = m_builder.CreateFCmpOEQ (count, llvm::ConstantFP::getInfinity (m_builder.getDoubleTy (), false ));
787788
788789 // Clamp count if <= 0 (we can skip the loop if count is not positive)
789790 llvm::Value *comparison = m_builder.CreateFCmpULE (count, llvm::ConstantFP::get (m_ctx, llvm::APFloat (0.0 )));
@@ -795,6 +796,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
795796 llvm::Function *roundFunc = llvm::Intrinsic::getDeclaration (m_module.get (), llvm::Intrinsic::round, { count->getType () });
796797 count = m_builder.CreateCall (roundFunc, { count });
797798 count = m_builder.CreateFPToSI (count, m_builder.getInt64Ty ()); // cast to signed integer
799+ count = m_builder.CreateSelect (isInf, zero, count);
798800
799801 // Jump to condition branch
800802 m_builder.CreateBr (loop.conditionBranch );
@@ -808,7 +810,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
808810 loop.afterLoop = llvm::BasicBlock::Create (m_ctx, " " , func);
809811
810812 llvm::Value *currentIndex = m_builder.CreateLoad (m_builder.getInt64Ty (), loop.index );
811- comparison = m_builder.CreateICmpULT (currentIndex, count);
813+ comparison = m_builder.CreateOr (isInf, m_builder. CreateICmpULT (currentIndex, count) );
812814 m_builder.CreateCondBr (comparison, body, loop.afterLoop );
813815
814816 // Switch to body branch
0 commit comments