https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117878
--- Comment #7 from Li Pan <pan2.li at intel dot com> ---
This insn is introduced during reload when lra_constraints. There will be const
vector like:
(const_vector:V8QI [
(const_int 4 [0x4])
(const_int 12 [0xc])
(const_int 5 [0x5])
(const_int 13 [0xd])
(const_int 6 [0x6])
(const_int 14 [0xe])
(const_int 7 [0x7])
(const_int 15 [0xf])
])
then expand_const_vector tries to generate it by vid and shift. At last the
expand_binop_directly will gen the pattern and then emit this insn.
(set (reg:V8QI 223) (lshiftrt:V8QI (reg:V8QI 222) (const_int 1 [0x1])))
Not sure if my understanding is correct but it looks nothing wrong here?
By the way, the define_insn_and_split contains 3 parts, define_insn,
define_split and define_expand, the
483 (define_insn_and_split "<optab><mode>3"
matched the standard name lshiftrt<mode>3, thus the reload is able to generate
the standard name pattern here as I understand. That indicates we can change
the name of "<optab><mode>3" to something like "xxx_<optab><mode>3" if we
really don't need this standard name for riscv backend.
Any suggestion here?
#0 expand_binop_directly (icode=CODE_FOR_lshrv8qi3, mode=E_V8QImode,
binoptab=lshr_optab, op0=0x7ffff723edb0, op1=0x7ffff74094a0, target=0x0,
unsignedp=0, methods=OPTAB_DIRECT, last=0x7ffff7239a00)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/optabs
cc:1474
1455 create_output_operand (&ops[0], target, tmp_mode); // create
(reg:V8QI 223)
1456 create_input_operand (&ops[1], xop0, mode0);
1457 create_input_operand (&ops[2], xop1, mode1);
1458 pat = maybe_gen_insn (icode, 3, ops);
pat = (set (reg:V8QI 223) (lshiftrt:V8QI (reg:V8QI 222) (const_int 1
[0x1])))
...
1474 emit_insn (pat);
#1 0x00000000019bc0bf in expand_binop (mode=E_V8QImode, binoptab=lshr_optab,
op0=0x7ffff723edb0, op1=0x7ffff74094a0, target=0x0, unsignedp=0,
methods=OPTAB_DIRECT)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/optabs
cc:1545
#2 0x00000000019bb37e in expand_simple_binop (mode=E_V8QImode, code=LSHIFTRT,
op0=0x7ffff723edb0, op1=0x7ffff74094a0, target=0x0, unsignedp=0,
methods=OPTAB_DIRECT)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/optabs
cc:1267
#3 0x00000000022e3b82 in riscv_vector::expand_const_vector
(target=0x7ffff723ed98, src=0x7ffff72255f0)
at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/config/riscv/riscv-v
cc:1442
1426 else
1427 {
1428 /* Case 2: For example as below:
1429 { -4, 4, -4 + 1, 4 + 1, -4 + 2, 4 + 2, -4 + 3, 4
+ 3, }
1430 */
1431 rvv_builder v (builder mode (), builder npatterns
(), 1);
1432
1433 /* Step 1: Generate { a, b, a, b, } */
1434 for (unsigned int i = 0; i < v npatterns (); ++i)
1435 v quick_push (builder elt (i));
1436 rtx new_base = v build ();
1437
1438 /* Step 2: Generate tmp1 = VID >> LOG2 (NPATTERNS)
*/
1439 rtx shift_count
1440 = gen_int_mode (exact_log2 (builder npatterns ()),
1441 builder inner_mode ());
1442 rtx tmp1 = expand_simple_binop (builder mode (),
LSHIFTRT,
1443 vid, shift_count,
NULL_RTX,
1444 false, OPTAB_DIRECT);
#4 0x00000000022e4764 in riscv_vector::legitimize_move (dest=0x7ffff723ed98,
srcp=0x7fffffffd078)
at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/config/riscv/riscv-v
cc:1605
#5 0x000000000374f410 in gen_movv8qi (operand0=0x7ffff723ed98,
operand1=0x7ffff72255f0)
at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/config/riscv/vector
md:1426
1421 (define_expand "mov<mode>"
1422 [(set (match_operand:VLS_AVL_IMM 0 "reg_or_mem_operand")
1423 (match_operand:VLS_AVL_IMM 1 "general_operand"))]
1424 "TARGET_VECTOR"
1425 {
1426 if (riscv_vector::legitimize_move (operands[0], &operands[1]))
1427 DONE;
1428 })
#6 0x00000000013b960b in insn_gen_fn::operator()<rtx_def*, rtx_def*>
(this=0x5208248 <insn_data+1381896>)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/gcc/recog
h:469
#7 0x00000000015a2759 in emit_move_insn_1 (x=0x7ffff723ed98, y=0x7ffff72255f0)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/expr
cc:4580
(set x = (reg:V8QI 221)
y = (const_vector:V8QI [
(const_int 4 [0x4])
(const_int 12 [0xc])
(const_int 5 [0x5])
(const_int 13 [0xd])
(const_int 6 [0x6])
(const_int 14 [0xe])
(const_int 7 [0x7])
(const_int 15 [0xf])
]))
#8 0x00000000015a319e in emit_move_insn (x=0x7ffff723ed98, y=0x7ffff72255f0)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/expr
cc:4750
#9 0x00000000018e80a8 in lra_emit_move (x=0x7ffff723ed98, y=0x7ffff72255f0)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/lra
cc:509
(set x = (reg:V8QI 221)
y = (const_vector:V8QI [
(const_int 4 [0x4])
(const_int 12 [0xc])
(const_int 5 [0x5])
(const_int 13 [0xd])
(const_int 6 [0x6])
(const_int 14 [0xe])
(const_int 7 [0x7])
(const_int 15 [0xf])
]))
#10 0x0000000001904029 in curr_insn_transform (check_only_p=false)
at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/lra-constraints
cc:4746
4737 if (get_reload_reg (type, mode, old, goal_alt[i],
4738
&goal_alt_exclude_start_hard_regs[i],
4739 loc != curr_id->operand_loc[i],
4740 curr_static_id->operand_alternative
4741 [goal_alt_number * n_operands + i]
earlyclobber,
4742 "", &new_reg)
4743 && type != OP_OUT)
4744 {
4745 push_to_sequence (before);
4746 lra_emit_move (new_reg, old);
4747 before = get_insns ();
4748 end_sequence ();
4749 }
#11 0x0000000001906918 in lra_constraints (first_p=false) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/lra-constraints
cc:5503
#12 0x00000000018ed5ab in lra (f=0x610cd40, verbose=5) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/lra cc:2463
#13 0x0000000001890dc2 in do_reload () at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/ira cc:5977
#14 0x00000000018912e3 in (anonymous namespace)::pass_reload::execute
(this=0x5f83d20) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/ira cc:6165
#15 0x0000000001a38d2d in execute_one_pass (pass=0x5f83d20) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/passes cc:2659
#16 0x0000000001a39110 in execute_pass_list_1 (pass=0x5f83d20) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/passes cc:2768
#17 0x0000000001a39141 in execute_pass_list_1 (pass=0x5f82990) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/passes cc:2769
#18 0x0000000001a3919e in execute_pass_list (fn=0x7ffff7fbc270, pass=0x5f7def0)
at /home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/passes
cc:2779
#19 0x000000000146090c in cgraph_node::expand (this=0x7ffff742d660) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/cgraphunit
cc:1857
#20 0x0000000001461161 in expand_all_functions () at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/ /gcc/cgraphunit
cc:2040
#21 0x0000000001461c9c in symbol_table::compile (this=0x7ffff7406000) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/cgraphunit
cc:2416
#22 0x0000000001462142 in symbol_table::finalize_compilation_unit
(this=0x7ffff7406000) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/cgraphunit
cc:2601
#23 0x0000000001bd424f in compile_file () at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/toplev cc:479
#24 0x0000000001bd78a1 in do_compile () at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/toplev cc:2208
#25 0x0000000001bd7d1f in toplev::main (this=0x7fffffffdce2, argc=20,
argv=0x7fffffffde28) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/toplev cc:2368
#26 0x000000000444906f in main (argc=20, argv=0x7fffffffde28) at
/home/pli/gcc/444/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__//gcc/main cc:39