@@ -4659,10 +4659,26 @@ namespace LCompilers {
4659
4659
4660
4660
llvm::Value* end_point_ptr = get_pointer_to_current_end_point (list);
4661
4661
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
+ );
4662
4673
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
+ );
4663
4679
llvm::AllocaInst *pos_ptr = builder0.CreateAlloca (
4664
4680
llvm::Type::getInt32Ty (context), nullptr );
4665
- LLVM::CreateStore (*builder, pos , pos_ptr);
4681
+ LLVM::CreateStore (*builder, adjusted_pos , pos_ptr);
4666
4682
llvm::Value* tmp = nullptr ;
4667
4683
4668
4684
// Get element to return
0 commit comments