This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: "invalid operand to binary operator" problem
- From: Daniel Berlin <dberlin at dberlin dot org>
- To: Ferenc Kovacs <feri1024 at freemail dot hu>
- Cc: gcc at gcc dot gnu dot org
- Date: Tue, 30 Aug 2005 09:36:44 -0400
- Subject: Re: "invalid operand to binary operator" problem
- References: <1125399172.1628.84.camel@neptun.homenetwork>
On Tue, 2005-08-30 at 10:52 +0000, Ferenc Kovacs wrote:
> Hello!
>
> I'm implementing a new IPA phase in GCC-4.1. I need to pass the address
> of a variable found in the stmt list to a newly created function (eg.
> "f") like this:
>
> {
> int x; /* ordinary non-pointertype local vars */
> int y;
>
> [...]
>
> x = 5;
> y = x + 9;
> f (&x); /* new call stmt inserted to the stmt list */
>
> [...]
> }
>
> I used the build_addr function to build the address of that variable
> used in the parameter list of the new function "f" and bsi_insert_... to
> insert the call. Anyway, I don't really know doing things like these are
> possible when we're still in the IPA stage...
Sure, they are.
> ^^ So, I got these error
> messages:
>
> [...]
> /home/feri/tmp/hello.c:118: error: invalid operand to binary operator
> x
>
> /home/feri/tmp/hello.c:118: internal compiler error: verify_stmts failed
> Please submit a full bug report,
> with preprocessed source if appropriate.
> See <URL:http://gcc.gnu.org/bugs.html> for instructions.
> [...]
>
> is_gimple_val returns false to the variable "x", becouse
> needs_to_live_in_memory (the build_addr sets the TREE_ADDRESSABLE flag)
> gives true to is_gimple_reg and this way is_gimple_reg returns false. I
> tried to manually set the TREE_ADDRESSABLE flag of "x" and not to insert
> any stmt containing the address of "x", but without "&x" I didn't get
> this error. It seems, that "x" is not a valid gimple rvalue. How can I
> make "x" a real gimple rvalue again?
You have to copy it.
IE
x = 5
y = x + 9
x.0 = x
f (&x)
x = x.0
We don't allow mixing of things that need to live in memory, and things
that don't, in binary operators.
It would be complete mess.