On Tue, Jun 16, 2020 at 5:00 AM Shuai Wang <wangshuai...@gmail.com> wrote: > > Yes, TREE_CODE (op1) != SSA_NAME shows that op1 is by no means SSA names > (although I don't know why). But how can I backwardly identify its > initialization statement _17 = (signed char *) _16? Thanks!
You want to walk over SSA operands of the stmt, not over operands using for example FOR_EACH_SSA_USE_OPERAND. > Shuai > > On Tue, Jun 16, 2020 at 10:32 AM Shuai Wang <wangshuai...@gmail.com> wrote: >> >> Got it. But in that sense, given a `op1` satisfies the >> "is_gimple_addressable" predicate (e.g., the _17 in my sample code), how can >> I find its def statement? Thank you very much. >> >> Shuai >> >> On Tue, Jun 16, 2020 at 3:19 AM Richard Biener <richard.guent...@gmail.com> >> wrote: >>> >>> On June 15, 2020 6:58:27 PM GMT+02:00, Shuai Wang <wangshuai...@gmail.com> >>> wrote: >>> >Thank you very much for your prompt response, Rchard. Sorry I was kinda >>> >"learning by doing". I am familiar with LLVM stuff but newbie to GCC >>> >specifications. >>> > >>> >Just want to make sure I got it right; _17 and _16 in the IR code are >>> >SSA >>> >variables. They are initialized for once and used once. Could you >>> >please >>> >shed some light on where "non-ssa name" comes in this scenario, and how >>> >exactly can I get _17 = (signed char *) _16 printed out? Thank you >>> >very >>> >much. >>> > >>> >Best, >>> >Shuai >>> > >>> >On Tue, Jun 16, 2020 at 12:52 AM Richard Biener >>> ><richard.guent...@gmail.com> >>> >wrote: >>> > >>> >> On June 15, 2020 6:31:38 PM GMT+02:00, Shuai Wang via Gcc >>> ><gcc@gcc.gnu.org> >>> >> wrote: >>> >> >Hello, >>> >> > >>> >> >Suppose given the following SSA statement generated by the `sanopt` >>> >> >pass: >>> >> > >>> >> > _17 = (signed char *) _16; >>> >> > _18 = *_17; >>> >> > >>> >> >I am using the following code to identify that _17 depends on _16: >>> >> > >>> >> >// def_stmt refers to _18 = &_17; >>> >> >for (unsigned i = 1; i < gimple_num_ops(def_stmt); i++) { >>> >> > op1 = gimple_assign_rhs1(def_stmt); >>> >>> op1 is not an SSA name here. >>> >>> >> > if (is_gimple_addressable(op1)) >>> >>> That predicate does not make sense on SSA names >>> >>> { >>> >> > gimple* def_stmt = SSA_NAME_DEF_STMT(op1); >>> >> > print_gimple_stmt(stderr, def_stmt, 0, TDF_SLIM); // crash >>> >at >>> >> >this point >>> >> > } >>> >> > >>> >> >It crashes with the following call stack: >>> >> > >>> >> >0xb5cd5f crash_signal >>> >> > ../../gcc-10.1.0/gcc/toplev.c:328 >>> >> >0x1452134 pp_format(pretty_printer*, text_info*) >>> >> > ../../gcc-10.1.0/gcc/pretty-print.c:1828 >>> >> >0x14533e4 pp_printf(pretty_printer*, char const*, ...) >>> >> > ../../gcc-10.1.0/gcc/pretty-print.c:1773 >>> >> >0x8dcc81 print_gimple_stmt(_IO_FILE*, gimple*, int, dump_flag) >>> >> > ../../gcc-10.1.0/gcc/gimple-pretty-print.c:157 >>> >> > >>> >> >I tried hard but just cannot understand why this would crash. >>> >Indeed, >>> >> >this >>> >> >code works pretty well when printing out other dependency >>> >statements, >>> >> >but >>> >> >just gets stuck in front of pointer dereference like _18 = *_17. >>> >> > >>> >> >Any suggestion would be appreciated. Thank you! >>> >> >>> >> Build your compiler with - - enable-checking and you'll figure you >>> >> reference SSA_NAME_DEF_STMT of a NON-SSA_NAME. I suggest you learn to >>> >use a >>> >> debugger. >>> >> >>> >> Richard. >>> >> >>> >> >Best, >>> >> >Shuai >>> >> >>> >> >>>