http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55334
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-11-16 13:29:05 UTC --- Ah, on the #c5 testcase the problem seems to be const float * vs. float *, /* If the references do not access the same object, we do not know whether they alias or not. */ if (!operand_equal_p (DR_BASE_OBJECT (a), DR_BASE_OBJECT (b), 0)) { DDR_ARE_DEPENDENT (res) = chrec_dont_know; return res; } operand_equal_p here fails because, while both base objects are MEM_REFs and operand_equal_p (TREE_OPERAND (DR_BASE_OBJECT (a), 0), TREE_OPERAND (DR_BASE_OBJECT (b), 0), 0) is true, the second operand of one MEM_REF is const float *, while on the other MEM_REF it is float *, and operand_equal_p for that tests: ... 2570 && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg0, 1))) 2571 == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg1, 1)))) 2572 && OP_SAME (0) && OP_SAME (1)); and the TYPE_MAIN_VARIANT check fails. In this case I believe we don't care whether it points to const float or float. Not sure if we should change operand_equal_p to try harder if TYPE_MAIN_VARIANT of the two types isn't equal, but TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (TREE_OPERAND (argX, 1)))) is equal, and both pointers have the same deref alias set, or perhaps just change the above spot to try harder on MEM_REFs if it failed.