MCPcopy Create free account
hub / github.com/apache/impala / CodegenCopyGroupingValues

Method CodegenCopyGroupingValues

be/src/exec/grouping-aggregator.cc:1299–1361  ·  view source on GitHub ↗

Codegen for CopyGroupingValues Example IR for (group by int_col, string_col): (mangled function names have been shortened) define void @CopyGroupingValues(%"class.impala::GroupingAggregator"* %this_ptr, %"class.impala::Tuple"* %intermediate_tuple, i8* %buffer) { entry: call void @_ZN6impala18GroupingAggregator30CopyGroupingValuesFixedLenSlot... (%"class.impala::GroupingAggregator"* %this_ptr, %"c

Source from the content-addressed store, hash-verified

1297 // ret void
1298 // }
1299Status GroupingAggregatorConfig::CodegenCopyGroupingValues(LlvmCodeGen* codegen,
1300 llvm::Function** fn) {
1301 llvm::PointerType* this_ptr_type = codegen->GetStructPtrType<GroupingAggregator>();
1302 llvm::PointerType* tuple_ptr_type = codegen->GetStructPtrType<Tuple>();
1303 LlvmCodeGen::FnPrototype prototype(codegen, "CopyGroupingValues",
1304 codegen->void_type());
1305 prototype.AddArgument(LlvmCodeGen::NamedVariable("this_ptr", this_ptr_type));
1306 prototype.AddArgument(
1307 LlvmCodeGen::NamedVariable("intermediate_tuple", tuple_ptr_type));
1308 prototype.AddArgument(LlvmCodeGen::NamedVariable("buffer", codegen->ptr_type()));
1309
1310 llvm::LLVMContext& context = codegen->context();
1311 LlvmBuilder builder(context);
1312 llvm::Value* args[3];
1313 *fn = prototype.GeneratePrototype(&builder, args);
1314
1315 llvm::Value* this_ptr = args[0];
1316 llvm::Value* intermediate_tuple = args[1];
1317 llvm::Value* buffer = args[2];
1318
1319 // Copy fixed len slots
1320 for (int i = 0; i < grouping_exprs_.size(); ++i) {
1321 // Get relevant data from slot desc as consts
1322 SlotDescriptor* slot_desc = intermediate_tuple_desc_->slots()[i];
1323 llvm::Value* idx = codegen->GetI32Constant(i);
1324 llvm::Value* tuple_offset = codegen->GetI32Constant(slot_desc->tuple_offset());
1325 llvm::Value* slot_size = codegen->GetI32Constant(slot_desc->slot_size());
1326
1327 llvm::Value* null_indicator_offset =
1328 slot_desc->null_indicator_offset().ToIRPacked(codegen);
1329
1330 // call CopyGroupingValuesFixedLenSlot
1331 codegen->CodegenCallFunction(&builder,
1332 IRFunction::GROUPING_AGG_COPY_GROUPING_VALUES_FIXED_LEN_SLOT,
1333 {this_ptr, intermediate_tuple, idx, null_indicator_offset, tuple_offset,
1334 slot_size});
1335 }
1336
1337 // Copy var len string data
1338 for (int expr_idx : string_grouping_exprs_) {
1339 // Get relevant data from slot desc as consts
1340 SlotDescriptor* slot_desc = intermediate_tuple_desc_->slots()[expr_idx];
1341 llvm::Value* tuple_offset = codegen->GetI32Constant(slot_desc->tuple_offset());
1342 llvm::Value* idx = codegen->GetI32Constant(expr_idx);
1343
1344 // call CopyGroupingValuesStringSlot
1345 llvm::Value* bytes_copied = codegen->CodegenCallFunction(&builder,
1346 IRFunction::GROUPING_AGG_COPY_GROUPING_VALUES_STRING_SLOT,
1347 {this_ptr, intermediate_tuple, idx, tuple_offset, buffer}, "bytes_copied");
1348
1349 // increase buffer by bytes copied
1350 buffer = builder.CreateGEP(buffer, bytes_copied, "buffer");
1351 }
1352
1353 builder.CreateRetVoid();
1354
1355 *fn = codegen->FinalizeFunction(*fn);
1356 if (*fn == nullptr) {

Callers

nothing calls this directly

Calls 15

NamedVariableClass · 0.85
OKFunction · 0.85
void_typeMethod · 0.80
AddArgumentMethod · 0.80
ptr_typeMethod · 0.80
contextMethod · 0.80
GeneratePrototypeMethod · 0.80
GetI32ConstantMethod · 0.80
tuple_offsetMethod · 0.80
slot_sizeMethod · 0.80
ToIRPackedMethod · 0.80
CodegenCallFunctionMethod · 0.80

Tested by

no test coverage detected