Hi, Recently I found a weird behavior in attribute computation when if_then_else is used. It may be easily demonstrated on i386 jump instruction. It's original length attribute definition is following:
(set (attr "length") (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -126)) (lt (minus (match_dup 0) (pc)) (const_int 128))) (const_int 2) (const_int 5))) I change it keeping the same resulting values: (set (attr "length") (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -126)) (lt (minus (match_dup 0) (pc)) (const_int 128))) (plus (const_int 2) (const_int 0)) (plus (const_int 5) (const_int 0)))) After that change I see in assembler: jmp .L2 # 412 jump [length = 2147483647] It also causes fails in make check because some optimizations work in a different way when size changes. I tried to debug it and found that insn_current_length function always return correct values when called for jump insn. Seems problem always occurs when 'if_then_else' or 'cond' is combined with 'plus'. Is such combination supposed to work? Thanks, Ilya