docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
intrinsic_lifting.h
Go to the documentation of this file.
2
4
5namespace docc {
6namespace lifting {
7
9private:
10 static bool is_noop(llvm::Intrinsic::ID iid) {
11 switch (iid) {
12 case llvm::Intrinsic::annotation:
13 case llvm::Intrinsic::assume:
14 case llvm::Intrinsic::dbg_assign:
15 case llvm::Intrinsic::dbg_declare:
16 case llvm::Intrinsic::dbg_label:
17 case llvm::Intrinsic::dbg_value:
18 case llvm::Intrinsic::donothing:
19 case llvm::Intrinsic::experimental_noalias_scope_decl:
20 case llvm::Intrinsic::invariant_end:
21 case llvm::Intrinsic::invariant_start:
22 case llvm::Intrinsic::lifetime_end:
23 case llvm::Intrinsic::lifetime_start:
24 case llvm::Intrinsic::ptr_annotation:
25 case llvm::Intrinsic::var_annotation:
26 return true;
27 default:
28 return false;
29 }
30 }
31
32 static bool is_tasklet(llvm::Intrinsic::ID iid) {
33 switch (iid) {
34 case llvm::Intrinsic::expect:
35 case llvm::Intrinsic::expect_with_probability:
36 case llvm::Intrinsic::abs:
37 case llvm::Intrinsic::smax:
38 case llvm::Intrinsic::smin:
39 case llvm::Intrinsic::scmp:
40 case llvm::Intrinsic::umax:
41 case llvm::Intrinsic::umin:
42 case llvm::Intrinsic::ucmp:
43 case llvm::Intrinsic::fmuladd:
44 return true;
45 default:
46 return false;
47 }
48 }
49
50 static sdfg::data_flow::TaskletCode as_tasklet(llvm::Intrinsic::ID iid) {
51 switch (iid) {
52 case llvm::Intrinsic::expect:
54 case llvm::Intrinsic::expect_with_probability:
56 case llvm::Intrinsic::abs:
58 case llvm::Intrinsic::smax:
60 case llvm::Intrinsic::smin:
62 case llvm::Intrinsic::scmp:
64 case llvm::Intrinsic::umax:
66 case llvm::Intrinsic::umin:
68 case llvm::Intrinsic::ucmp:
70 case llvm::Intrinsic::fmuladd:
72 default:
73 throw std::runtime_error("Intrinsic not mapped to a tasklet");
74 }
75 }
76
77 static bool is_math(llvm::Intrinsic::ID iid) {
78 switch (iid) {
79 case llvm::Intrinsic::acos:
80 case llvm::Intrinsic::asin:
81 case llvm::Intrinsic::atan:
82 case llvm::Intrinsic::ceil:
83 case llvm::Intrinsic::copysign:
84 case llvm::Intrinsic::cos:
85 case llvm::Intrinsic::cosh:
86 case llvm::Intrinsic::exp:
87 case llvm::Intrinsic::exp10:
88 case llvm::Intrinsic::exp2:
89 case llvm::Intrinsic::fabs:
90 case llvm::Intrinsic::floor:
91 case llvm::Intrinsic::fma:
92 case llvm::Intrinsic::ldexp:
93 case llvm::Intrinsic::llrint:
94 case llvm::Intrinsic::llround:
95 case llvm::Intrinsic::log:
96 case llvm::Intrinsic::log10:
97 case llvm::Intrinsic::log2:
98 case llvm::Intrinsic::lrint:
99 case llvm::Intrinsic::lround:
100 case llvm::Intrinsic::maximum:
101 case llvm::Intrinsic::maxnum:
102 case llvm::Intrinsic::minimum:
103 case llvm::Intrinsic::minnum:
104 case llvm::Intrinsic::nearbyint:
105 case llvm::Intrinsic::pow:
106 case llvm::Intrinsic::powi:
107 case llvm::Intrinsic::rint:
108 case llvm::Intrinsic::round:
109 case llvm::Intrinsic::roundeven:
110 case llvm::Intrinsic::sin:
111 case llvm::Intrinsic::sinh:
112 case llvm::Intrinsic::sqrt:
113 case llvm::Intrinsic::tan:
114 case llvm::Intrinsic::tanh:
115 case llvm::Intrinsic::trunc:
116 return true;
117 default:
118 return false;
119 }
120 }
121
122 static sdfg::math::cmath::CMathFunction as_math_function(llvm::Intrinsic::ID iid) {
123 switch (iid) {
124 case llvm::Intrinsic::acos:
126 case llvm::Intrinsic::asin:
128 case llvm::Intrinsic::atan:
130 case llvm::Intrinsic::ceil:
132 case llvm::Intrinsic::copysign:
134 case llvm::Intrinsic::cos:
136 case llvm::Intrinsic::cosh:
138 case llvm::Intrinsic::exp:
140 case llvm::Intrinsic::exp10:
142 case llvm::Intrinsic::exp2:
144 case llvm::Intrinsic::fabs:
146 case llvm::Intrinsic::floor:
148 case llvm::Intrinsic::fma:
150 case llvm::Intrinsic::ldexp:
152 case llvm::Intrinsic::llrint:
154 case llvm::Intrinsic::llround:
156 case llvm::Intrinsic::log:
158 case llvm::Intrinsic::log10:
160 case llvm::Intrinsic::log2:
162 case llvm::Intrinsic::lrint:
164 case llvm::Intrinsic::lround:
166 case llvm::Intrinsic::maximum:
168 case llvm::Intrinsic::maxnum:
170 case llvm::Intrinsic::minimum:
172 case llvm::Intrinsic::minnum:
174 case llvm::Intrinsic::nearbyint:
176 case llvm::Intrinsic::pow:
178 case llvm::Intrinsic::rint:
180 case llvm::Intrinsic::round:
182 case llvm::Intrinsic::roundeven:
184 case llvm::Intrinsic::sin:
186 case llvm::Intrinsic::sinh:
188 case llvm::Intrinsic::sqrt:
190 case llvm::Intrinsic::tan:
192 case llvm::Intrinsic::tanh:
194 case llvm::Intrinsic::trunc:
196 default: {
197 throw std::runtime_error("Intrinsic does not map to a math function");
198 }
199 }
200 };
201
202 sdfg::control_flow::State& visit_tasklet(
203 const llvm::BasicBlock* block, const llvm::IntrinsicInst* instruction, sdfg::control_flow::State& current_state
204 );
205
206 sdfg::control_flow::State& visit_math(
207 const llvm::BasicBlock* block, const llvm::IntrinsicInst* instruction, sdfg::control_flow::State& current_state
208 );
209
210 sdfg::control_flow::State& visit_memcpy(
211 const llvm::BasicBlock* block, const llvm::IntrinsicInst* instruction, sdfg::control_flow::State& current_state
212 );
213
214 sdfg::control_flow::State& visit_memmove(
215 const llvm::BasicBlock* block, const llvm::IntrinsicInst* instruction, sdfg::control_flow::State& current_state
216 );
217
218 sdfg::control_flow::State& visit_memset(
219 const llvm::BasicBlock* block, const llvm::IntrinsicInst* instruction, sdfg::control_flow::State& current_state
220 );
221
222 sdfg::control_flow::State& visit_trap(
223 const llvm::BasicBlock* block, const llvm::IntrinsicInst* instruction, sdfg::control_flow::State& current_state
224 );
225
226public:
228 llvm::TargetLibraryInfo& TLI,
229 const llvm::DataLayout& DL,
230 const llvm::Function& function,
231 sdfg::FunctionType target_type,
233 std::map<const llvm::BasicBlock*, std::set<const sdfg::control_flow::State*>>& state_mapping,
234 std::map<const sdfg::control_flow::State*, std::set<const llvm::BasicBlock*>>& pred_mapping,
235 std::unordered_map<const llvm::Value*, std::string>& constants_mapping,
236 std::unordered_map<const llvm::Type*, std::string> anonymous_types_mapping
237 )
239 TLI,
240 DL,
241 function,
242 target_type,
243 builder,
244 state_mapping,
245 pred_mapping,
246 constants_mapping,
247 anonymous_types_mapping
248 ) {
249 }
250
252 const llvm::BasicBlock* block, const llvm::CallBase* instruction, sdfg::control_flow::State& current_state
253 ) override;
254
255 static bool is_supported(const llvm::IntrinsicInst* intrinsic) {
256 auto iid = intrinsic->getIntrinsicID();
257 switch (iid) {
258 case llvm::Intrinsic::abs: {
259 // Check if strict argument is set
260 auto strict_arg = intrinsic->getArgOperand(1);
261 if (auto const_int = llvm::dyn_cast<llvm::ConstantInt>(strict_arg)) {
262 if (const_int->getBitWidth() == 1) {
263 return !const_int->isZero();
264 }
265 }
266 return false;
267 }
268 case llvm::Intrinsic::acos:
269 return true;
270 case llvm::Intrinsic::annotation:
271 return true;
272 case llvm::Intrinsic::arithmetic_fence:
273 return false;
274 case llvm::Intrinsic::addressofreturnaddress:
275 return false;
276 case llvm::Intrinsic::adjust_trampoline:
277 return false;
278 case llvm::Intrinsic::allow_runtime_check:
279 return false;
280 case llvm::Intrinsic::allow_ubsan_check:
281 return false;
282 case llvm::Intrinsic::asan_check_memaccess:
283 return false;
284 case llvm::Intrinsic::asin:
285 return true;
286 case llvm::Intrinsic::assume:
287 return true;
288 case llvm::Intrinsic::atan:
289 return true;
290 case llvm::Intrinsic::bitreverse:
291 return false;
292 case llvm::Intrinsic::bswap:
293 return false;
294 case llvm::Intrinsic::call_preallocated_arg:
295 return false;
296 case llvm::Intrinsic::call_preallocated_setup:
297 return false;
298 case llvm::Intrinsic::call_preallocated_teardown:
299 return false;
300 case llvm::Intrinsic::callbr_landingpad:
301 return false;
302 case llvm::Intrinsic::canonicalize:
303 return false;
304 case llvm::Intrinsic::ceil:
305 return true;
306 case llvm::Intrinsic::clear_cache:
307 return false;
308 case llvm::Intrinsic::codeview_annotation:
309 return false;
310 case llvm::Intrinsic::convert_from_fp16:
311 return false;
312 case llvm::Intrinsic::convert_to_fp16:
313 return false;
314 case llvm::Intrinsic::copysign:
315 return true;
316 case llvm::Intrinsic::coro_align:
317 return false;
318 case llvm::Intrinsic::coro_alloc:
319 return false;
320 case llvm::Intrinsic::coro_alloca_alloc:
321 return false;
322 case llvm::Intrinsic::coro_alloca_free:
323 return false;
324 case llvm::Intrinsic::coro_alloca_get:
325 return false;
326 case llvm::Intrinsic::coro_async_context_alloc:
327 return false;
328 case llvm::Intrinsic::coro_async_context_dealloc:
329 return false;
330 case llvm::Intrinsic::coro_async_resume:
331 return false;
332 case llvm::Intrinsic::coro_async_size_replace:
333 return false;
334 case llvm::Intrinsic::coro_await_suspend_bool:
335 return false;
336 case llvm::Intrinsic::coro_await_suspend_handle:
337 return false;
338 case llvm::Intrinsic::coro_await_suspend_void:
339 return false;
340 case llvm::Intrinsic::coro_begin:
341 return false;
342 case llvm::Intrinsic::coro_destroy:
343 return false;
344 case llvm::Intrinsic::coro_done:
345 return false;
346 case llvm::Intrinsic::coro_end:
347 return false;
348 case llvm::Intrinsic::coro_end_async:
349 return false;
350 case llvm::Intrinsic::coro_end_results:
351 return false;
352 case llvm::Intrinsic::coro_frame:
353 return false;
354 case llvm::Intrinsic::coro_free:
355 return false;
356 case llvm::Intrinsic::coro_id:
357 return false;
358 case llvm::Intrinsic::coro_id_async:
359 return false;
360 case llvm::Intrinsic::coro_id_retcon:
361 return false;
362 case llvm::Intrinsic::coro_id_retcon_once:
363 return false;
364 case llvm::Intrinsic::coro_noop:
365 return false;
366 case llvm::Intrinsic::coro_prepare_async:
367 return false;
368 case llvm::Intrinsic::coro_prepare_retcon:
369 return false;
370 case llvm::Intrinsic::coro_promise:
371 return false;
372 case llvm::Intrinsic::coro_resume:
373 return false;
374 case llvm::Intrinsic::coro_save:
375 return false;
376 case llvm::Intrinsic::coro_size:
377 return false;
378 case llvm::Intrinsic::coro_subfn_addr:
379 return false;
380 case llvm::Intrinsic::coro_suspend:
381 return false;
382 case llvm::Intrinsic::coro_suspend_async:
383 return false;
384 case llvm::Intrinsic::coro_suspend_retcon:
385 return false;
386 case llvm::Intrinsic::cos:
387 return true;
388 case llvm::Intrinsic::cosh:
389 return true;
390 case llvm::Intrinsic::ctlz:
391 return false;
392 case llvm::Intrinsic::ctpop:
393 return false;
394 case llvm::Intrinsic::cttz:
395 return false;
396 case llvm::Intrinsic::dbg_assign:
397 return true;
398 case llvm::Intrinsic::dbg_declare:
399 return true;
400 case llvm::Intrinsic::dbg_label:
401 return true;
402 case llvm::Intrinsic::dbg_value:
403 return true;
404 case llvm::Intrinsic::debugtrap:
405 return false;
406 case llvm::Intrinsic::donothing:
407 return true;
408 case llvm::Intrinsic::eh_dwarf_cfa:
409 return false;
410 case llvm::Intrinsic::eh_exceptioncode:
411 return false;
412 case llvm::Intrinsic::eh_exceptionpointer:
413 return false;
414 case llvm::Intrinsic::eh_recoverfp:
415 return false;
416 case llvm::Intrinsic::eh_return_i32:
417 return false;
418 case llvm::Intrinsic::eh_return_i64:
419 return false;
420 case llvm::Intrinsic::eh_sjlj_callsite:
421 return false;
422 case llvm::Intrinsic::eh_sjlj_functioncontext:
423 return false;
424 case llvm::Intrinsic::eh_sjlj_longjmp:
425 return false;
426 case llvm::Intrinsic::eh_sjlj_lsda:
427 return false;
428 case llvm::Intrinsic::eh_sjlj_setjmp:
429 return false;
430 case llvm::Intrinsic::eh_sjlj_setup_dispatch:
431 return false;
432 case llvm::Intrinsic::eh_typeid_for:
433 return false;
434 case llvm::Intrinsic::eh_unwind_init:
435 return false;
436 case llvm::Intrinsic::exp:
437 return true;
438 case llvm::Intrinsic::exp10:
439 return true;
440 case llvm::Intrinsic::exp2:
441 return true;
442 case llvm::Intrinsic::expect:
443 return true;
444 case llvm::Intrinsic::expect_with_probability:
445 return true;
446 case llvm::Intrinsic::experimental_constrained_acos:
447 return false;
448 case llvm::Intrinsic::experimental_constrained_asin:
449 return false;
450 case llvm::Intrinsic::experimental_constrained_atan:
451 return false;
452 case llvm::Intrinsic::experimental_constrained_ceil:
453 return false;
454 case llvm::Intrinsic::experimental_constrained_cos:
455 return false;
456 case llvm::Intrinsic::experimental_constrained_cosh:
457 return false;
458 case llvm::Intrinsic::experimental_constrained_exp:
459 return false;
460 case llvm::Intrinsic::experimental_constrained_exp2:
461 return false;
462 case llvm::Intrinsic::experimental_constrained_fadd:
463 return false;
464 case llvm::Intrinsic::experimental_constrained_fcmp:
465 return false;
466 case llvm::Intrinsic::experimental_constrained_fcmps:
467 return false;
468 case llvm::Intrinsic::experimental_constrained_fdiv:
469 return false;
470 case llvm::Intrinsic::experimental_constrained_floor:
471 return false;
472 case llvm::Intrinsic::experimental_constrained_fma:
473 return false;
474 case llvm::Intrinsic::experimental_constrained_fmul:
475 return false;
476 case llvm::Intrinsic::experimental_constrained_fmuladd:
477 return false;
478 case llvm::Intrinsic::experimental_constrained_fpext:
479 return false;
480 case llvm::Intrinsic::experimental_constrained_fptosi:
481 return false;
482 case llvm::Intrinsic::experimental_constrained_fptoui:
483 return false;
484 case llvm::Intrinsic::experimental_constrained_fptrunc:
485 return false;
486 case llvm::Intrinsic::experimental_constrained_frem:
487 return false;
488 case llvm::Intrinsic::experimental_constrained_fsub:
489 return false;
490 case llvm::Intrinsic::experimental_constrained_ldexp:
491 return false;
492 case llvm::Intrinsic::experimental_constrained_llrint:
493 return false;
494 case llvm::Intrinsic::experimental_constrained_llround:
495 return false;
496 case llvm::Intrinsic::experimental_constrained_log:
497 return false;
498 case llvm::Intrinsic::experimental_constrained_log10:
499 return false;
500 case llvm::Intrinsic::experimental_constrained_log2:
501 return false;
502 case llvm::Intrinsic::experimental_constrained_lrint:
503 return false;
504 case llvm::Intrinsic::experimental_constrained_lround:
505 return false;
506 case llvm::Intrinsic::experimental_constrained_maximum:
507 return false;
508 case llvm::Intrinsic::experimental_constrained_maxnum:
509 return false;
510 case llvm::Intrinsic::experimental_constrained_minimum:
511 return false;
512 case llvm::Intrinsic::experimental_constrained_minnum:
513 return false;
514 case llvm::Intrinsic::experimental_constrained_nearbyint:
515 return false;
516 case llvm::Intrinsic::experimental_constrained_pow:
517 return false;
518 case llvm::Intrinsic::experimental_constrained_powi:
519 return false;
520 case llvm::Intrinsic::experimental_constrained_rint:
521 return false;
522 case llvm::Intrinsic::experimental_constrained_round:
523 return false;
524 case llvm::Intrinsic::experimental_constrained_roundeven:
525 return false;
526 case llvm::Intrinsic::experimental_constrained_sin:
527 return false;
528 case llvm::Intrinsic::experimental_constrained_sinh:
529 return false;
530 case llvm::Intrinsic::experimental_constrained_sitofp:
531 return false;
532 case llvm::Intrinsic::experimental_constrained_sqrt:
533 return false;
534 case llvm::Intrinsic::experimental_constrained_tan:
535 return false;
536 case llvm::Intrinsic::experimental_constrained_tanh:
537 return false;
538 case llvm::Intrinsic::experimental_constrained_trunc:
539 return false;
540 case llvm::Intrinsic::experimental_constrained_uitofp:
541 return false;
542 case llvm::Intrinsic::experimental_convergence_anchor:
543 return false;
544 case llvm::Intrinsic::experimental_convergence_entry:
545 return false;
546 case llvm::Intrinsic::experimental_convergence_loop:
547 return false;
548 case llvm::Intrinsic::experimental_cttz_elts:
549 return false;
550 case llvm::Intrinsic::experimental_deoptimize:
551 return false;
552 case llvm::Intrinsic::experimental_gc_get_pointer_base:
553 return false;
554 case llvm::Intrinsic::experimental_gc_get_pointer_offset:
555 return false;
556 case llvm::Intrinsic::experimental_gc_relocate:
557 return false;
558 case llvm::Intrinsic::experimental_gc_result:
559 return false;
560 case llvm::Intrinsic::experimental_gc_statepoint:
561 return false;
562 case llvm::Intrinsic::experimental_get_vector_length:
563 return false;
564 case llvm::Intrinsic::experimental_guard:
565 return false;
566 case llvm::Intrinsic::experimental_noalias_scope_decl:
567 return true;
568 case llvm::Intrinsic::experimental_patchpoint:
569 return false;
570 case llvm::Intrinsic::experimental_patchpoint_void:
571 return false;
572 case llvm::Intrinsic::experimental_stackmap:
573 return false;
574 case llvm::Intrinsic::experimental_vector_compress:
575 return false;
576 case llvm::Intrinsic::experimental_vector_histogram_add:
577 return false;
578 case llvm::Intrinsic::experimental_vector_partial_reduce_add:
579 return false;
580 case llvm::Intrinsic::experimental_vp_reverse:
581 return false;
582 case llvm::Intrinsic::experimental_vp_splat:
583 return false;
584 case llvm::Intrinsic::experimental_vp_splice:
585 return false;
586 case llvm::Intrinsic::experimental_vp_strided_load:
587 return false;
588 case llvm::Intrinsic::experimental_vp_strided_store:
589 return false;
590 case llvm::Intrinsic::experimental_widenable_condition:
591 return false;
592 case llvm::Intrinsic::fabs:
593 return true;
594 case llvm::Intrinsic::floor:
595 return true;
596 case llvm::Intrinsic::fma:
597 return true;
598 case llvm::Intrinsic::fmuladd:
599 return true;
600 case llvm::Intrinsic::fptosi_sat:
601 return false;
602 case llvm::Intrinsic::fptoui_sat:
603 return false;
604 case llvm::Intrinsic::fptrunc_round:
605 return false;
606 case llvm::Intrinsic::frameaddress:
607 return false;
608 case llvm::Intrinsic::frexp:
609 return false;
610 case llvm::Intrinsic::fshl:
611 return false;
612 case llvm::Intrinsic::fshr:
613 return false;
614 case llvm::Intrinsic::gcread:
615 return false;
616 case llvm::Intrinsic::gcroot:
617 return false;
618 case llvm::Intrinsic::gcwrite:
619 return false;
620 case llvm::Intrinsic::get_active_lane_mask:
621 return false;
622 case llvm::Intrinsic::get_dynamic_area_offset:
623 return false;
624 case llvm::Intrinsic::get_fpenv:
625 return false;
626 case llvm::Intrinsic::get_fpmode:
627 return false;
628 case llvm::Intrinsic::get_rounding:
629 return false;
630 case llvm::Intrinsic::hwasan_check_memaccess:
631 return false;
632 case llvm::Intrinsic::hwasan_check_memaccess_fixedshadow:
633 return false;
634 case llvm::Intrinsic::hwasan_check_memaccess_shortgranules:
635 return false;
636 case llvm::Intrinsic::hwasan_check_memaccess_shortgranules_fixedshadow:
637 return false;
638 case llvm::Intrinsic::icall_branch_funnel:
639 return false;
640 case llvm::Intrinsic::init_trampoline:
641 return false;
642 case llvm::Intrinsic::instrprof_callsite:
643 return false;
644 case llvm::Intrinsic::instrprof_cover:
645 return false;
646 case llvm::Intrinsic::instrprof_increment:
647 return false;
648 case llvm::Intrinsic::instrprof_increment_step:
649 return false;
650 case llvm::Intrinsic::instrprof_mcdc_parameters:
651 return false;
652 case llvm::Intrinsic::instrprof_mcdc_tvbitmap_update:
653 return false;
654 case llvm::Intrinsic::instrprof_timestamp:
655 return false;
656 case llvm::Intrinsic::instrprof_value_profile:
657 return false;
658 case llvm::Intrinsic::invariant_end:
659 return true;
660 case llvm::Intrinsic::invariant_start:
661 return true;
662 case llvm::Intrinsic::is_constant:
663 return false;
664 case llvm::Intrinsic::is_fpclass:
665 return false;
666 case llvm::Intrinsic::launder_invariant_group:
667 return false;
668 case llvm::Intrinsic::ldexp:
669 return true;
670 case llvm::Intrinsic::lifetime_end:
671 return true;
672 case llvm::Intrinsic::lifetime_start:
673 return true;
674 case llvm::Intrinsic::llrint:
675 return true;
676 case llvm::Intrinsic::llround:
677 return true;
678 case llvm::Intrinsic::load_relative:
679 return false;
680 case llvm::Intrinsic::localaddress:
681 return false;
682 case llvm::Intrinsic::localescape:
683 return false;
684 case llvm::Intrinsic::localrecover:
685 return false;
686 case llvm::Intrinsic::log:
687 return true;
688 case llvm::Intrinsic::log10:
689 return true;
690 case llvm::Intrinsic::log2:
691 return true;
692 case llvm::Intrinsic::loop_decrement:
693 return false;
694 case llvm::Intrinsic::loop_decrement_reg:
695 return false;
696 case llvm::Intrinsic::lrint:
697 return true;
698 case llvm::Intrinsic::lround:
699 return true;
700 case llvm::Intrinsic::masked_compressstore:
701 return false;
702 case llvm::Intrinsic::masked_expandload:
703 return false;
704 case llvm::Intrinsic::masked_gather:
705 return false;
706 case llvm::Intrinsic::masked_load:
707 return false;
708 case llvm::Intrinsic::masked_scatter:
709 return false;
710 case llvm::Intrinsic::masked_store:
711 return false;
712 case llvm::Intrinsic::matrix_column_major_load:
713 return false;
714 case llvm::Intrinsic::matrix_column_major_store:
715 return false;
716 case llvm::Intrinsic::matrix_multiply:
717 return false;
718 case llvm::Intrinsic::matrix_transpose:
719 return false;
720 case llvm::Intrinsic::maximum:
721 return true;
722 case llvm::Intrinsic::maxnum:
723 return true;
724 case llvm::Intrinsic::memcpy:
725 return true;
726 case llvm::Intrinsic::memcpy_element_unordered_atomic:
727 return false;
728 case llvm::Intrinsic::memcpy_inline:
729 return false;
730 case llvm::Intrinsic::memmove:
731 return true;
732 case llvm::Intrinsic::memmove_element_unordered_atomic:
733 return false;
734 case llvm::Intrinsic::memset:
735 return true;
736 case llvm::Intrinsic::memset_element_unordered_atomic:
737 return false;
738 case llvm::Intrinsic::memset_inline:
739 return false;
740 case llvm::Intrinsic::minimum:
741 return true;
742 case llvm::Intrinsic::minnum:
743 return true;
744 case llvm::Intrinsic::nearbyint:
745 return true;
746 case llvm::Intrinsic::objc_arc_annotation_bottomup_bbend:
747 return false;
748 case llvm::Intrinsic::objc_arc_annotation_bottomup_bbstart:
749 return false;
750 case llvm::Intrinsic::objc_arc_annotation_topdown_bbend:
751 return false;
752 case llvm::Intrinsic::objc_arc_annotation_topdown_bbstart:
753 return false;
754 case llvm::Intrinsic::objc_autorelease:
755 return false;
756 case llvm::Intrinsic::objc_autoreleasePoolPop:
757 return false;
758 case llvm::Intrinsic::objc_autoreleasePoolPush:
759 return false;
760 case llvm::Intrinsic::objc_autoreleaseReturnValue:
761 return false;
762 case llvm::Intrinsic::objc_clang_arc_noop_use:
763 return false;
764 case llvm::Intrinsic::objc_clang_arc_use:
765 return false;
766 case llvm::Intrinsic::objc_copyWeak:
767 return false;
768 case llvm::Intrinsic::objc_destroyWeak:
769 return false;
770 case llvm::Intrinsic::objc_initWeak:
771 return false;
772 case llvm::Intrinsic::objc_loadWeak:
773 return false;
774 case llvm::Intrinsic::objc_loadWeakRetained:
775 return false;
776 case llvm::Intrinsic::objc_moveWeak:
777 return false;
778 case llvm::Intrinsic::objc_release:
779 return false;
780 case llvm::Intrinsic::objc_retain:
781 return false;
782 case llvm::Intrinsic::objc_retain_autorelease:
783 return false;
784 case llvm::Intrinsic::objc_retainAutorelease:
785 return false;
786 case llvm::Intrinsic::objc_retainAutoreleaseReturnValue:
787 return false;
788 case llvm::Intrinsic::objc_retainAutoreleasedReturnValue:
789 return false;
790 case llvm::Intrinsic::objc_retainBlock:
791 return false;
792 case llvm::Intrinsic::objc_retainedObject:
793 return false;
794 case llvm::Intrinsic::objc_storeStrong:
795 return false;
796 case llvm::Intrinsic::objc_storeWeak:
797 return false;
798 case llvm::Intrinsic::objc_sync_enter:
799 return false;
800 case llvm::Intrinsic::objc_sync_exit:
801 return false;
802 case llvm::Intrinsic::objc_unretainedObject:
803 return false;
804 case llvm::Intrinsic::objc_unretainedPointer:
805 return false;
806 case llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
807 return false;
808 case llvm::Intrinsic::objectsize:
809 return false;
810 case llvm::Intrinsic::pcmarker:
811 return false;
812 case llvm::Intrinsic::pow:
813 return true;
814 case llvm::Intrinsic::powi:
815 return true;
816 case llvm::Intrinsic::prefetch:
817 return false;
818 case llvm::Intrinsic::preserve_array_access_index:
819 return false;
820 case llvm::Intrinsic::preserve_static_offset:
821 return false;
822 case llvm::Intrinsic::preserve_struct_access_index:
823 return false;
824 case llvm::Intrinsic::preserve_union_access_index:
825 return false;
826 case llvm::Intrinsic::pseudoprobe:
827 return false;
828 case llvm::Intrinsic::ptr_annotation:
829 return true;
830 case llvm::Intrinsic::ptrauth_auth:
831 return false;
832 case llvm::Intrinsic::ptrauth_blend:
833 return false;
834 case llvm::Intrinsic::ptrauth_resign:
835 return false;
836 case llvm::Intrinsic::ptrauth_sign:
837 return false;
838 case llvm::Intrinsic::ptrauth_sign_generic:
839 return false;
840 case llvm::Intrinsic::ptrauth_strip:
841 return false;
842 case llvm::Intrinsic::ptrmask:
843 return false;
844 case llvm::Intrinsic::public_type_test:
845 return false;
846 case llvm::Intrinsic::read_register:
847 return false;
848 case llvm::Intrinsic::read_volatile_register:
849 return false;
850 case llvm::Intrinsic::readcyclecounter:
851 return false;
852 case llvm::Intrinsic::readsteadycounter:
853 return false;
854 case llvm::Intrinsic::reset_fpenv:
855 return false;
856 case llvm::Intrinsic::reset_fpmode:
857 return false;
858 case llvm::Intrinsic::returnaddress:
859 return false;
860 case llvm::Intrinsic::rint:
861 return true;
862 case llvm::Intrinsic::round:
863 return true;
864 case llvm::Intrinsic::roundeven:
865 return true;
866 case llvm::Intrinsic::sadd_sat:
867 return false;
868 case llvm::Intrinsic::sadd_with_overflow:
869 return false;
870 case llvm::Intrinsic::scmp:
871 return true;
872 case llvm::Intrinsic::sdiv_fix:
873 return false;
874 case llvm::Intrinsic::sdiv_fix_sat:
875 return false;
876 case llvm::Intrinsic::seh_scope_begin:
877 return false;
878 case llvm::Intrinsic::seh_scope_end:
879 return false;
880 case llvm::Intrinsic::seh_try_begin:
881 return false;
882 case llvm::Intrinsic::seh_try_end:
883 return false;
884 case llvm::Intrinsic::set_fpenv:
885 return false;
886 case llvm::Intrinsic::set_fpmode:
887 return false;
888 case llvm::Intrinsic::set_loop_iterations:
889 return false;
890 case llvm::Intrinsic::set_rounding:
891 return false;
892 case llvm::Intrinsic::sideeffect:
893 return false;
894 case llvm::Intrinsic::sin:
895 return true;
896 case llvm::Intrinsic::sinh:
897 return true;
898 case llvm::Intrinsic::smax:
899 return true;
900 case llvm::Intrinsic::smin:
901 return true;
902 case llvm::Intrinsic::smul_fix:
903 return false;
904 case llvm::Intrinsic::smul_fix_sat:
905 return false;
906 case llvm::Intrinsic::smul_with_overflow:
907 return false;
908 case llvm::Intrinsic::sponentry:
909 return false;
910 case llvm::Intrinsic::sqrt:
911 return true;
912 case llvm::Intrinsic::ssa_copy:
913 return false;
914 case llvm::Intrinsic::sshl_sat:
915 return false;
916 case llvm::Intrinsic::ssub_sat:
917 return false;
918 case llvm::Intrinsic::ssub_with_overflow:
919 return false;
920 case llvm::Intrinsic::stackguard:
921 return false;
922 case llvm::Intrinsic::stackprotector:
923 return false;
924 case llvm::Intrinsic::stackrestore:
925 return false;
926 case llvm::Intrinsic::stacksave:
927 return false;
928 case llvm::Intrinsic::start_loop_iterations:
929 return false;
930 case llvm::Intrinsic::stepvector:
931 return false;
932 case llvm::Intrinsic::strip_invariant_group:
933 return false;
934 case llvm::Intrinsic::swift_async_context_addr:
935 return false;
936 case llvm::Intrinsic::tan:
937 return true;
938 case llvm::Intrinsic::tanh:
939 return true;
940 case llvm::Intrinsic::test_set_loop_iterations:
941 return false;
942 case llvm::Intrinsic::test_start_loop_iterations:
943 return false;
944 case llvm::Intrinsic::thread_pointer:
945 return false;
946 case llvm::Intrinsic::threadlocal_address:
947 return false;
948 case llvm::Intrinsic::trap:
949 return true;
950 case llvm::Intrinsic::trunc:
951 return true;
952 case llvm::Intrinsic::type_checked_load:
953 return false;
954 case llvm::Intrinsic::type_checked_load_relative:
955 return false;
956 case llvm::Intrinsic::type_test:
957 return false;
958 case llvm::Intrinsic::uadd_sat:
959 return false;
960 case llvm::Intrinsic::uadd_with_overflow:
961 return false;
962 case llvm::Intrinsic::ubsantrap:
963 return false;
964 case llvm::Intrinsic::ucmp:
965 return true;
966 case llvm::Intrinsic::udiv_fix:
967 return false;
968 case llvm::Intrinsic::udiv_fix_sat:
969 return false;
970 case llvm::Intrinsic::umax:
971 return true;
972 case llvm::Intrinsic::umin:
973 return true;
974 case llvm::Intrinsic::umul_fix:
975 return false;
976 case llvm::Intrinsic::umul_fix_sat:
977 return false;
978 case llvm::Intrinsic::umul_with_overflow:
979 return false;
980 case llvm::Intrinsic::ushl_sat:
981 return false;
982 case llvm::Intrinsic::usub_sat:
983 return false;
984 case llvm::Intrinsic::usub_with_overflow:
985 return false;
986 case llvm::Intrinsic::vacopy:
987 return false;
988 case llvm::Intrinsic::vaend:
989 return false;
990 case llvm::Intrinsic::vastart:
991 return false;
992 case llvm::Intrinsic::var_annotation:
993 return true;
994 case llvm::Intrinsic::vector_deinterleave2:
995 return false;
996 case llvm::Intrinsic::vector_extract:
997 return false;
998 case llvm::Intrinsic::vector_insert:
999 return false;
1000 case llvm::Intrinsic::vector_interleave2:
1001 return false;
1002 case llvm::Intrinsic::vector_reduce_add:
1003 return false;
1004 case llvm::Intrinsic::vector_reduce_and:
1005 return false;
1006 case llvm::Intrinsic::vector_reduce_fadd:
1007 return false;
1008 case llvm::Intrinsic::vector_reduce_fmax:
1009 return false;
1010 case llvm::Intrinsic::vector_reduce_fmaximum:
1011 return false;
1012 case llvm::Intrinsic::vector_reduce_fmin:
1013 return false;
1014 case llvm::Intrinsic::vector_reduce_fminimum:
1015 return false;
1016 case llvm::Intrinsic::vector_reduce_fmul:
1017 return false;
1018 case llvm::Intrinsic::vector_reduce_mul:
1019 return false;
1020 case llvm::Intrinsic::vector_reduce_or:
1021 return false;
1022 case llvm::Intrinsic::vector_reduce_smax:
1023 return false;
1024 case llvm::Intrinsic::vector_reduce_smin:
1025 return false;
1026 case llvm::Intrinsic::vector_reduce_umax:
1027 return false;
1028 case llvm::Intrinsic::vector_reduce_umin:
1029 return false;
1030 case llvm::Intrinsic::vector_reduce_xor:
1031 return false;
1032 case llvm::Intrinsic::vector_reverse:
1033 return false;
1034 case llvm::Intrinsic::vector_splice:
1035 return false;
1036 case llvm::Intrinsic::vp_abs:
1037 return false;
1038 case llvm::Intrinsic::vp_add:
1039 return false;
1040 case llvm::Intrinsic::vp_and:
1041 return false;
1042 case llvm::Intrinsic::vp_ashr:
1043 return false;
1044 case llvm::Intrinsic::vp_bitreverse:
1045 return false;
1046 case llvm::Intrinsic::vp_bswap:
1047 return false;
1048 case llvm::Intrinsic::vp_ceil:
1049 return false;
1050 case llvm::Intrinsic::vp_copysign:
1051 return false;
1052 case llvm::Intrinsic::vp_ctlz:
1053 return false;
1054 case llvm::Intrinsic::vp_ctpop:
1055 return false;
1056 case llvm::Intrinsic::vp_cttz:
1057 return false;
1058 case llvm::Intrinsic::vp_cttz_elts:
1059 return false;
1060 case llvm::Intrinsic::vp_fabs:
1061 return false;
1062 case llvm::Intrinsic::vp_fadd:
1063 return false;
1064 case llvm::Intrinsic::vp_fcmp:
1065 return false;
1066 case llvm::Intrinsic::vp_fdiv:
1067 return false;
1068 case llvm::Intrinsic::vp_floor:
1069 return false;
1070 case llvm::Intrinsic::vp_fma:
1071 return false;
1072 case llvm::Intrinsic::vp_fmul:
1073 return false;
1074 case llvm::Intrinsic::vp_fmuladd:
1075 return false;
1076 case llvm::Intrinsic::vp_fneg:
1077 return false;
1078 case llvm::Intrinsic::vp_fpext:
1079 return false;
1080 case llvm::Intrinsic::vp_fptosi:
1081 return false;
1082 case llvm::Intrinsic::vp_fptoui:
1083 return false;
1084 case llvm::Intrinsic::vp_fptrunc:
1085 return false;
1086 case llvm::Intrinsic::vp_frem:
1087 return false;
1088 case llvm::Intrinsic::vp_fshl:
1089 return false;
1090 case llvm::Intrinsic::vp_fshr:
1091 return false;
1092 case llvm::Intrinsic::vp_fsub:
1093 return false;
1094 case llvm::Intrinsic::vp_gather:
1095 return false;
1096 case llvm::Intrinsic::vp_icmp:
1097 return false;
1098 case llvm::Intrinsic::vp_inttoptr:
1099 return false;
1100 case llvm::Intrinsic::vp_is_fpclass:
1101 return false;
1102 case llvm::Intrinsic::vp_llrint:
1103 return false;
1104 case llvm::Intrinsic::vp_load:
1105 return false;
1106 case llvm::Intrinsic::vp_lrint:
1107 return false;
1108 case llvm::Intrinsic::vp_lshr:
1109 return false;
1110 case llvm::Intrinsic::vp_maximum:
1111 return false;
1112 case llvm::Intrinsic::vp_maxnum:
1113 return false;
1114 case llvm::Intrinsic::vp_merge:
1115 return false;
1116 case llvm::Intrinsic::vp_minimum:
1117 return false;
1118 case llvm::Intrinsic::vp_minnum:
1119 return false;
1120 case llvm::Intrinsic::vp_mul:
1121 return false;
1122 case llvm::Intrinsic::vp_nearbyint:
1123 return false;
1124 case llvm::Intrinsic::vp_or:
1125 return false;
1126 case llvm::Intrinsic::vp_ptrtoint:
1127 return false;
1128 case llvm::Intrinsic::vp_reduce_add:
1129 return false;
1130 case llvm::Intrinsic::vp_reduce_and:
1131 return false;
1132 case llvm::Intrinsic::vp_reduce_fadd:
1133 return false;
1134 case llvm::Intrinsic::vp_reduce_fmax:
1135 return false;
1136 case llvm::Intrinsic::vp_reduce_fmaximum:
1137 return false;
1138 case llvm::Intrinsic::vp_reduce_fmin:
1139 return false;
1140 case llvm::Intrinsic::vp_reduce_fminimum:
1141 return false;
1142 case llvm::Intrinsic::vp_reduce_fmul:
1143 return false;
1144 case llvm::Intrinsic::vp_reduce_mul:
1145 return false;
1146 case llvm::Intrinsic::vp_reduce_or:
1147 return false;
1148 case llvm::Intrinsic::vp_reduce_smax:
1149 return false;
1150 case llvm::Intrinsic::vp_reduce_smin:
1151 return false;
1152 case llvm::Intrinsic::vp_reduce_umax:
1153 return false;
1154 case llvm::Intrinsic::vp_reduce_umin:
1155 return false;
1156 case llvm::Intrinsic::vp_reduce_xor:
1157 return false;
1158 case llvm::Intrinsic::vp_rint:
1159 return false;
1160 case llvm::Intrinsic::vp_round:
1161 return false;
1162 case llvm::Intrinsic::vp_roundeven:
1163 return false;
1164 case llvm::Intrinsic::vp_roundtozero:
1165 return false;
1166 case llvm::Intrinsic::vp_sadd_sat:
1167 return false;
1168 case llvm::Intrinsic::vp_scatter:
1169 return false;
1170 case llvm::Intrinsic::vp_sdiv:
1171 return false;
1172 case llvm::Intrinsic::vp_select:
1173 return false;
1174 case llvm::Intrinsic::vp_sext:
1175 return false;
1176 case llvm::Intrinsic::vp_shl:
1177 return false;
1178 case llvm::Intrinsic::vp_sitofp:
1179 return false;
1180 case llvm::Intrinsic::vp_smax:
1181 return false;
1182 case llvm::Intrinsic::vp_smin:
1183 return false;
1184 case llvm::Intrinsic::vp_sqrt:
1185 return false;
1186 case llvm::Intrinsic::vp_srem:
1187 return false;
1188 case llvm::Intrinsic::vp_ssub_sat:
1189 return false;
1190 case llvm::Intrinsic::vp_store:
1191 return false;
1192 case llvm::Intrinsic::vp_sub:
1193 return false;
1194 case llvm::Intrinsic::vp_trunc:
1195 return false;
1196 case llvm::Intrinsic::vp_uadd_sat:
1197 return false;
1198 case llvm::Intrinsic::vp_udiv:
1199 return false;
1200 case llvm::Intrinsic::vp_uitofp:
1201 return false;
1202 case llvm::Intrinsic::vp_umax:
1203 return false;
1204 case llvm::Intrinsic::vp_umin:
1205 return false;
1206 case llvm::Intrinsic::vp_urem:
1207 return false;
1208 case llvm::Intrinsic::vp_usub_sat:
1209 return false;
1210 case llvm::Intrinsic::vp_xor:
1211 return false;
1212 case llvm::Intrinsic::vp_zext:
1213 return false;
1214 case llvm::Intrinsic::vscale:
1215 return false;
1216 case llvm::Intrinsic::write_register:
1217 return false;
1218 case llvm::Intrinsic::xray_customevent:
1219 return false;
1220 case llvm::Intrinsic::xray_typedevent:
1221 return false;
1222 }
1223 throw std::runtime_error("This point shall not be reached");
1224 };
1225};
1226
1227} // namespace lifting
1228} // namespace docc
FunctionLifting(llvm::TargetLibraryInfo &TLI, const llvm::DataLayout &DL, const llvm::Function &function, sdfg::FunctionType target_type, sdfg::builder::SDFGBuilder &builder, std::map< const llvm::BasicBlock *, std::set< const sdfg::control_flow::State * > > &state_mapping, std::map< const sdfg::control_flow::State *, std::set< const llvm::BasicBlock * > > &pred_mapping, std::unordered_map< const llvm::Value *, std::string > &constants_mapping, std::unordered_map< const llvm::Type *, std::string > &anonymous_types_mapping)
Definition function_lifting.h:41
sdfg::control_flow::State & visit(const llvm::BasicBlock *block, const llvm::CallBase *instruction, sdfg::control_flow::State &current_state) override
static bool is_supported(const llvm::IntrinsicInst *intrinsic)
Definition intrinsic_lifting.h:255
IntrinsicLifting(llvm::TargetLibraryInfo &TLI, const llvm::DataLayout &DL, const llvm::Function &function, sdfg::FunctionType target_type, sdfg::builder::SDFGBuilder &builder, std::map< const llvm::BasicBlock *, std::set< const sdfg::control_flow::State * > > &state_mapping, std::map< const sdfg::control_flow::State *, std::set< const llvm::BasicBlock * > > &pred_mapping, std::unordered_map< const llvm::Value *, std::string > &constants_mapping, std::unordered_map< const llvm::Type *, std::string > anonymous_types_mapping)
Definition intrinsic_lifting.h:227
Definition sdfg_builder.h:13
A state in a Stateful DataFlow Graph (SDFG).
Definition state.h:38
Definition exceptions.h:9
Definition targets.h:8
Definition function_builder.h:10
TaskletCode
Operation codes for tasklet computations.
Definition tasklet.h:94
@ fp_fma
Floating-point fused multiply-add.
Definition tasklet.h:104
@ int_ucmp
Unsigned comparison (-1, 0, 1).
Definition tasklet.h:140
@ int_umax
Unsigned maximum.
Definition tasklet.h:139
@ int_smin
Signed minimum.
Definition tasklet.h:135
@ assign
Assignment/copy operation (can be cast if types differ).
Definition tasklet.h:95
@ int_umin
Unsigned minimum.
Definition tasklet.h:138
@ int_abs
Integer absolute value.
Definition tasklet.h:152
@ int_smax
Signed maximum.
Definition tasklet.h:136
@ int_scmp
Signed comparison (-1, 0, 1).
Definition tasklet.h:137
CMathFunction
Enumeration of C math library functions.
Definition cmath_node.h:21
@ cosh
Definition cmath_node.h:33
@ llround
Definition cmath_node.h:68
@ nearbyint
Definition cmath_node.h:70
@ pow
Definition cmath_node.h:50
@ fabs
Definition cmath_node.h:62
@ lround
Definition cmath_node.h:67
@ lrint
Definition cmath_node.h:72
@ cos
Definition cmath_node.h:24
@ tan
Definition cmath_node.h:25
@ tanh
Definition cmath_node.h:34
@ asin
Definition cmath_node.h:26
@ fmax
Definition cmath_node.h:90
@ atan
Definition cmath_node.h:28
@ ceil
Definition cmath_node.h:63
@ floor
Definition cmath_node.h:64
@ log2
Definition cmath_node.h:46
@ sin
Definition cmath_node.h:23
@ rint
Definition cmath_node.h:71
@ fma
Definition cmath_node.h:95
@ fmin
Definition cmath_node.h:91
@ round
Definition cmath_node.h:66
@ sinh
Definition cmath_node.h:32
@ exp
Definition cmath_node.h:40
@ roundeven
Definition cmath_node.h:69
@ acos
Definition cmath_node.h:27
@ llrint
Definition cmath_node.h:73
@ exp10
Definition cmath_node.h:42
@ log10
Definition cmath_node.h:45
@ copysign
Definition cmath_node.h:87
@ log
Definition cmath_node.h:44
@ sqrt
Definition cmath_node.h:51
@ trunc
Definition cmath_node.h:65
@ exp2
Definition cmath_node.h:41
@ ldexp
Definition cmath_node.h:79
StringEnum FunctionType
Definition function.h:37