Skip to content
This repository was archived by the owner on Mar 25, 2025. It is now read-only.

Commit ff5430c

Browse files
georgemitenkovpramodk
authored andcommitted
[LLVM] Support for newer versions of LLVM APIs
This commit fixes deprications warnings and errors that occur due to switch of LLVM to opaque pointers: recent versions of LLVM instruction builder APIs require explicit type parameters when doing `gep`s, `load`s, `gather`s. Moreover, with recent change to LLVM `https://reviews.llvm.org/D106678` MASSV SIMD functions have no `_P8` suffix by default. Tests were adjusted to take that into account. Note: tested with the LLVM version from `brew` (13).
1 parent f721890 commit ff5430c

File tree

2 files changed

+32
-16
lines changed

2 files changed

+32
-16
lines changed

src/codegen/llvm/llvm_ir_builder.cpp

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -347,11 +347,14 @@ llvm::Value* IRBuilder::create_inbounds_gep(const std::string& var_name, llvm::V
347347

348348
// Since we index through the pointer, we need an extra 0 index in the indices list for GEP.
349349
ValueVector indices{llvm::ConstantInt::get(get_i64_type(), 0), index};
350-
return builder.CreateInBoundsGEP(variable_ptr, indices);
350+
llvm::Type* variable_type = variable_ptr->getType()->getPointerElementType();
351+
return builder.CreateInBoundsGEP(variable_type, variable_ptr, indices);
351352
}
352353

353354
llvm::Value* IRBuilder::create_inbounds_gep(llvm::Value* variable, llvm::Value* index) {
354-
return builder.CreateInBoundsGEP(variable, {index});
355+
ValueVector indices{index};
356+
llvm::Type* variable_type = variable->getType()->getPointerElementType();
357+
return builder.CreateInBoundsGEP(variable_type, variable, indices);
355358
}
356359

357360
llvm::Value* IRBuilder::create_index(llvm::Value* value) {
@@ -378,23 +381,25 @@ llvm::Value* IRBuilder::create_index(llvm::Value* value) {
378381

379382
llvm::Value* IRBuilder::create_load(const std::string& name, bool masked) {
380383
llvm::Value* ptr = lookup_value(name);
384+
llvm::Type* loaded_type = ptr->getType()->getPointerElementType();
381385

382386
// Check if the generated IR is vectorized and masked.
383387
if (masked) {
384-
return builder.CreateMaskedLoad(ptr, llvm::Align(), mask);
388+
builder.CreateMaskedLoad(loaded_type, ptr, llvm::Align(), mask);
385389
}
386-
llvm::Type* loaded_type = ptr->getType()->getPointerElementType();
387390
llvm::Value* loaded = builder.CreateLoad(loaded_type, ptr);
388391
value_stack.push_back(loaded);
389392
return loaded;
390393
}
391394

392395
llvm::Value* IRBuilder::create_load(llvm::Value* ptr, bool masked) {
396+
llvm::Type* loaded_type = ptr->getType()->getPointerElementType();
397+
393398
// Check if the generated IR is vectorized and masked.
394399
if (masked) {
395-
return builder.CreateMaskedLoad(ptr, llvm::Align(), mask);
400+
builder.CreateMaskedLoad(loaded_type, ptr, llvm::Align(), mask);
396401
}
397-
llvm::Type* loaded_type = ptr->getType()->getPointerElementType();
402+
398403
llvm::Value* loaded = builder.CreateLoad(loaded_type, ptr);
399404
value_stack.push_back(loaded);
400405
return loaded;
@@ -466,7 +471,9 @@ llvm::Value* IRBuilder::get_struct_member_ptr(llvm::Value* struct_variable, int
466471
ValueVector indices;
467472
indices.push_back(llvm::ConstantInt::get(get_i32_type(), 0));
468473
indices.push_back(llvm::ConstantInt::get(get_i32_type(), member_index));
469-
return builder.CreateInBoundsGEP(struct_variable, indices);
474+
475+
llvm::Type* type = struct_variable->getType()->getPointerElementType();
476+
return builder.CreateInBoundsGEP(type, struct_variable, indices);
470477
}
471478

472479
void IRBuilder::invert_mask() {
@@ -491,14 +498,23 @@ llvm::Value* IRBuilder::load_to_or_store_from_array(const std::string& id_name,
491498
bool generating_vector_ir = vector_width > 1 && vectorize;
492499

493500
// If the vector code is generated, we need to distinguish between two cases. If the array is
494-
// indexed indirectly (i.e. not by an induction variable `kernel_id`), create a gather
495-
// instruction.
501+
// indexed indirectly (i.e. not by an induction variable `kernel_id`), create gather/scatter
502+
// instructions.
496503
if (id_name != kernel_id && generating_vector_ir) {
497-
return maybe_value_to_store ? builder.CreateMaskedScatter(maybe_value_to_store,
498-
element_ptr,
499-
llvm::Align(),
500-
mask)
501-
: builder.CreateMaskedGather(element_ptr, llvm::Align(), mask);
504+
if (maybe_value_to_store) {
505+
return builder.CreateMaskedScatter(maybe_value_to_store,
506+
element_ptr,
507+
llvm::Align(),
508+
mask);
509+
} else {
510+
// Construct the loaded vector type.
511+
auto* ptrs = llvm::cast<llvm::VectorType>(element_ptr->getType());
512+
llvm::ElementCount element_count = ptrs->getElementCount();
513+
llvm::Type* element_type = ptrs->getElementType()->getPointerElementType();
514+
llvm::Type* loaded_type = llvm::VectorType::get(element_type, element_count);
515+
516+
return builder.CreateMaskedGather(loaded_type, element_ptr, llvm::Align(), mask);
517+
}
502518
}
503519

504520
llvm::Value* ptr;

test/unit/codegen/codegen_llvm_ir.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,8 +1354,8 @@ SCENARIO("Vector library calls", "[visitor][llvm][vector_lib]") {
13541354
/*use_single_precision=*/false,
13551355
/*vector_width=*/2,
13561356
/*vec_lib=*/"MASSV");
1357-
std::regex massv2_exp_decl(R"(declare <2 x double> @__expd2_P8\(<2 x double>\))");
1358-
std::regex massv2_exp_call(R"(call <2 x double> @__expd2_P8\(<2 x double> .*\))");
1357+
std::regex massv2_exp_decl(R"(declare <2 x double> @__expd2\(<2 x double>\))");
1358+
std::regex massv2_exp_call(R"(call <2 x double> @__expd2\(<2 x double> .*\))");
13591359
REQUIRE(std::regex_search(massv2_library_module_str, m, massv2_exp_decl));
13601360
REQUIRE(std::regex_search(massv2_library_module_str, m, massv2_exp_call));
13611361
REQUIRE(!std::regex_search(massv2_library_module_str, m, exp_call));

0 commit comments

Comments
 (0)