> How can we have a PLUS on a CONST_DOUBLE and a CONST_INT? That does > not make sense, as there is no MODE argument that could make this work > correctly. From your description, MODE must be some integer mode, in > which case it is wrong to be using a CONST_DOUBLE in SFmode. > > (I don't know where the bug is; I'm just trying to help pin it down.) Here it is!! The problem is that for the following insn(insn 20 19 21 2 (set (reg:SI 141) (xor:SI (subreg:SI (reg:SF 139) 0) (reg:SI 140))) 65 {xorsi3} (expr_list:REG_EQUAL (const_double:SF 0 [0x0] -0.0 [-0x0.0p+0]) (nil)))
reg:SI 140 is known to have the constant value (const_int -2147483648 [0x80000000])) and (subreg:SI (reg:SF 139) 0) is known to have the value (const_double:SF 0 [0x0] 0.0 [0x0.0p+0]) [ as described by my previous post in the same thread ] Now, simplify_binary_operation_1 in simplify-rtx.c tries to /* Canonicalize XOR of the most significant bit to PLUS. */ (simplify-rtx.c:2203) and this results in a PLUS on CONST_INT and CONST_DOUBLE. maybe there should be a better check before canonicalizing here ? Thanks, Pranav