Hi, I was sorting SSA trees and DECL_P trees into different buckets. I used DECL_P as a proxy for it being a local/global variable/function (essentially a declaration). It seems that "probabilistically", I'm kinda right. Normally there is no tree that is both an SSA_VAR_P and a DECL_P at the same time, but there appears to be at least one in a couple of large benchmarks.
What could lead to a tree being declared both SSA_VAR_P and DECL_P? The first instance I've looked at where this happens the variable in the source is a static class member. But are there other cases? And why would it be the case that for smaller benchmarks there seems to be no instance of trees that are both SSA_VAR_P and DECL_P at the same time? I've been interpreting DECL_P as any variable that actually takes up memory. E.g., for every DECL_P variable there will be space allocated on the stack. But SSA_VAR_P does not need space allocated since they are just an abstraction to think about the flow of assignments. For example, we might have the following pseudo-gimple: PARM cond // variable cond is a boolean parameter (also DECL_P) DECL int i. // variable i is a local integer declaration // stack space is reserved for int i if (cond) { i_0 = 0 // i_0 is an SSA variable that corresponds to i } else { i_1 = 1 // same } i_2 = phi(i_0, i_1) In the end i_x will refer to the stack location reserved for i. I think that this is a somewhat naive view of the execution model but it is not until now that I found a counter example. Is the above not the case? As another note, I have not gone through the details on how static class member variables are implemented, so perhaps there are some details there where it would make sense to have a variable be both SSA_VAR_P and DECL_P. Can someone shed some light on this? Thanks! Thanks!