https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54589
--- Comment #14 from Jaydeep Chauhan <jaydeepchauhan1494 at gmail dot com> --- (In reply to Jaydeep Chauhan from comment #10) I have tried solve this case using define_split or define_insn_and_split but i am facing is some issue as per below: 1.It is not possible to combine below four instruction addq $1, %rax salq $4, %rax addq p1(%rip), %rax movl (%rax), %eax into the this shlq $4, %rcx movl 16(%rax,%rcx), %eax using define_split or define_insn_and_split To add offset "16" and "p1" it is creating problem because "p1" is symbol ref. 2.Also to optimize addq p1(%rip), %rax movl (%rax), %eax into a single instruction it should need to be seperate define_split or define_insn_and_split. So it should need to be seperate 3.I have also tried this case with peephole but i am facing same problem with this also (define_peephole2 [(parallel [(set (match_operand:DI 0 "register_operand") (plus:DI (match_dup 0) (match_operand:DI 1 "const_int_operand"))) (clobber (reg:CC FLAGS_REG))]) (parallel [(set (match_dup 0) (ashift:DI (match_dup 0) (match_operand 2 "const_int_operand"))) (clobber (reg:CC FLAGS_REG))]) (parallel [(set (match_dup 0) (plus:DI (match_operand:DI 4 "nonimmediate_operand") (mem:DI (match_operand:SDWIM 5 "<general_hilo_operand>")))) (clobber (reg:CC FLAGS_REG))])] "" [(parallel [(set (match_dup 0) (ashift:DI (match_dup 0)(match_dup 2))) (clobber (reg:CC FLAGS_REG))]) (parallel [(set (match_dup 0) (plus:DI (match_dup 4) (mem:DI (match_dup 5)))) (clobber (reg:CC FLAGS_REG))])] { int scale = 8 << INTVAL (operands[1]); operands[4] = gen_rtx_PLUS (DImode,operands[4], GEN_INT (scale)); }) Please share your comment/suggestion on this.