@@ -4659,10 +4659,26 @@ namespace LCompilers {
46594659
46604660 llvm::Value* end_point_ptr = get_pointer_to_current_end_point (list);
46614661 llvm::Value* end_point = LLVM::CreateLoad (*builder, end_point_ptr);
4662+ llvm::Value* zero = llvm::ConstantInt::get (llvm::Type::getInt32Ty (context),
4663+ llvm::APInt (32 , 0 ));
4664+ llvm::Value* adjusted_pos = pos;
4665+ llvm::Value* is_negative = builder->CreateICmpSLT (pos, zero);
4666+ llvm::Value* abs_pos = builder->CreateSelect (is_negative,
4667+ builder->CreateNeg (pos),
4668+ pos
4669+ );
4670+ llvm::Value* is_negative_and_in_bounds = builder->CreateAnd (is_negative,
4671+ builder->CreateICmpULE (abs_pos, end_point)
4672+ );
46624673
4674+ // If the index is negative, convert it to the corresponding positive index
4675+ adjusted_pos = builder->CreateSelect (is_negative_and_in_bounds,
4676+ builder->CreateAdd (end_point, pos),
4677+ adjusted_pos
4678+ );
46634679 llvm::AllocaInst *pos_ptr = builder0.CreateAlloca (
46644680 llvm::Type::getInt32Ty (context), nullptr );
4665- LLVM::CreateStore (*builder, pos , pos_ptr);
4681+ LLVM::CreateStore (*builder, adjusted_pos , pos_ptr);
46664682 llvm::Value* tmp = nullptr ;
46674683
46684684 // Get element to return
0 commit comments