Hi, I am working on an analysis that is able to determine some static information about a specific variable. At the moment, I would like to avoid much of the transformation by taking advantage of other GCC's passes. So, I can imagine something like, create an ASSERT_EXPR and let other passes change the CFG, and remove dead code, fold constants, etc.
At the moment I am only prototyping it, and so I have created a SIMPLE_IPA_PASS during LTO that finds the variables of interest and then creates an ASSERT_EXPR which contains the static information of interest. This looks to be working somewhat correctly. When I print the functions' gimple everything looks ok. The pass doesn't fail even if I use the TODO_verify_all flag at the end of the SIMPLE_IPA_PASS. However, the transformation triggers a segfault during fixup_cfg and I am unsure what can be the case. My questions are: 1. Is it possible to insert new ASSERT_EXPR during LTO and have other tree passes transform the function based on this? 2. How complex can the ASSERT_EXPR be? I can see that it must be a COND expr, by which it can be EQ_EXPR, NE_EXPR, LT_EXPR... and others. But what if I need to express something like a bitmask to guarantee that certain bits are zero? Could I have a complicated ASSERT_EXPR where COND is ASSERT_EXPR (a & 0xff == 0)? Or should I break it down? temp = a & 0xff; ASSERT_EXPR (temp == 0); 3. Any other advice? Thanks!