* Question on replacing .MASK_STORE with ternary expressions
@ 2023-10-25 15:24 Hanke Zhang
2023-10-25 15:40 ` Richard Biener
0 siblings, 1 reply; 4+ messages in thread
From: Hanke Zhang @ 2023-10-25 15:24 UTC (permalink / raw)
To: gcc
Hi, I got a gimple relative question.
I'm trying to replace the .MASK_STORE with a ternary expression in
pass_ifcvt like below:
.MASK_STORE(addr, align, mask, value) => *addr = mask ? value : *addr;
But when I do this, I'm stucked. The addr here is a SSA_NAME of
course. When I try to get the value that 'addr' points to through a
SSA_NAME as lhs like the code below, GCC reports an error.
// get MASK_STORE
gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
tree addr = gimple_call_arg (stmt, 0);
tree mask = gimple_call_arg (stmt, 2);
tree rhs = gimple_call_arg (stmt, 3);
// deref_ssa = *addr
tree deref_ssa = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
tree deref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
gimple *stmt1 = gimple_build_assign(deref_ssa, deref);
// ssa1 = mask ? deref_ssa : rhs
tree cond = build3 (COND_EXPR, TREE_TYPE (rhs), mask, rhs, deref_ssa);
tree ssa1 = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
gimple *stmt2 = gimple_build_assign(ssa1, cond);
// *addr = ssa1
tree indirect_ref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
gimple *stmt3 = gimple_build_assign(indirect_ref, ssa1);
// insert stmts
gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
// remove the origin MASK_STORE
gsi_remove (&gsi, true);
The error:
_588 = *_589;
_587 = _136 ? _272 : _588;
*_589 = _587;
unhandled expression in get_expr_operands():
<indirect_ref 0x7f25f5299880
type <real_type 0x7f25f57a12a0 float SF
size <integer_cst 0x7f25f5781e40 constant 32>
unit-size <integer_cst 0x7f25f5781e58 constant 4>
align:32 warn_if_not_align:0 symtab:0 alias-set 8
canonical-type 0x7f25f57a12a0 precision:32
pointer_to_this <pointer_type 0x7f25f57a1888>>
arg:0 <ssa_name 0x7f25f4fbc948
type <pointer_type 0x7f25f57a1888 type <real_type 0x7f25f57a12a0 float>
public unsigned DI
size <integer_cst 0x7f25f5781c00 constant 64>
unit-size <integer_cst 0x7f25f5781c18 constant 8>
align:64 warn_if_not_align:0 symtab:0 alias-set 20
structural-equality>
def_stmt _589 = &IMAGPART_EXPR <_452->amplitude>;
version:589
ptr-info 0x7f25f5716f18>>
Is there a way to fix this?
Thanks
Hanke Zhang
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Question on replacing .MASK_STORE with ternary expressions
2023-10-25 15:24 Question on replacing .MASK_STORE with ternary expressions Hanke Zhang
@ 2023-10-25 15:40 ` Richard Biener
2023-10-25 16:09 ` Hanke Zhang
0 siblings, 1 reply; 4+ messages in thread
From: Richard Biener @ 2023-10-25 15:40 UTC (permalink / raw)
To: Hanke Zhang; +Cc: gcc
> Am 25.10.2023 um 17:25 schrieb Hanke Zhang via Gcc <gcc@gcc.gnu.org>:
>
> Hi, I got a gimple relative question.
>
> I'm trying to replace the .MASK_STORE with a ternary expression in
> pass_ifcvt like below:
>
> .MASK_STORE(addr, align, mask, value) => *addr = mask ? value : *addr;
>
> But when I do this, I'm stucked. The addr here is a SSA_NAME of
> course. When I try to get the value that 'addr' points to through a
> SSA_NAME as lhs like the code below, GCC reports an error.
>
> // get MASK_STORE
> gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
> tree addr = gimple_call_arg (stmt, 0);
> tree mask = gimple_call_arg (stmt, 2);
> tree rhs = gimple_call_arg (stmt, 3);
>
> // deref_ssa = *addr
> tree deref_ssa = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
> tree deref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
> gimple *stmt1 = gimple_build_assign(deref_ssa, deref);
>
> // ssa1 = mask ? deref_ssa : rhs
> tree cond = build3 (COND_EXPR, TREE_TYPE (rhs), mask, rhs, deref_ssa);
> tree ssa1 = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
> gimple *stmt2 = gimple_build_assign(ssa1, cond);
>
> // *addr = ssa1
> tree indirect_ref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
> gimple *stmt3 = gimple_build_assign(indirect_ref, ssa1);
>
> // insert stmts
> gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
> gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
> gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
>
> // remove the origin MASK_STORE
> gsi_remove (&gsi, true);
>
> The error:
>
> _588 = *_589;
> _587 = _136 ? _272 : _588;
> *_589 = _587;
> unhandled expression in get_expr_operands():
> <indirect_ref 0x7f25f5299880
> type <real_type 0x7f25f57a12a0 float SF
> size <integer_cst 0x7f25f5781e40 constant 32>
> unit-size <integer_cst 0x7f25f5781e58 constant 4>
> align:32 warn_if_not_align:0 symtab:0 alias-set 8
> canonical-type 0x7f25f57a12a0 precision:32
> pointer_to_this <pointer_type 0x7f25f57a1888>>
>
> arg:0 <ssa_name 0x7f25f4fbc948
> type <pointer_type 0x7f25f57a1888 type <real_type 0x7f25f57a12a0 float>
> public unsigned DI
> size <integer_cst 0x7f25f5781c00 constant 64>
> unit-size <integer_cst 0x7f25f5781c18 constant 8>
> align:64 warn_if_not_align:0 symtab:0 alias-set 20
> structural-equality>
>
> def_stmt _589 = &IMAGPART_EXPR <_452->amplitude>;
> version:589
> ptr-info 0x7f25f5716f18>>
>
> Is there a way to fix this?
You need to use a MEM_REF , not an INDIRECT_REF
> Thanks
> Hanke Zhang
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Question on replacing .MASK_STORE with ternary expressions
2023-10-25 15:40 ` Richard Biener
@ 2023-10-25 16:09 ` Hanke Zhang
2023-10-25 16:51 ` Hanke Zhang
0 siblings, 1 reply; 4+ messages in thread
From: Hanke Zhang @ 2023-10-25 16:09 UTC (permalink / raw)
To: Richard Biener; +Cc: gcc
Hi Richard:
I think I need to get the value that 'addr' points to, is MEM_REF really right?
And I try to replace INDIRECT_REF with MEM_REF like this:
tree deref = build1 (MEM_REF , TREE_TYPE (deref_ssa), addr);
// ...
tree indirect_ref = build1 (MEM_REF , TREE_TYPE (deref_ssa), addr);
And the error is different, I think that means the type is not fit.
0x7afca4 build1(tree_code, tree_node*, tree_node*)
../../gcc/tree.cc:4968
0xe8292b replace_mask_store()
../../gcc/tree-if-conv.cc:3486
0xe8a03d execute
../../gcc/tree-if-conv.cc:3563
0xe8a03d execute
../../gcc/tree-if-conv.cc:3549
Richard Biener <richard.guenther@gmail.com> 于2023年10月25日周三 23:40写道:
>
>
>
> > Am 25.10.2023 um 17:25 schrieb Hanke Zhang via Gcc <gcc@gcc.gnu.org>:
> >
> > Hi, I got a gimple relative question.
> >
> > I'm trying to replace the .MASK_STORE with a ternary expression in
> > pass_ifcvt like below:
> >
> > .MASK_STORE(addr, align, mask, value) => *addr = mask ? value : *addr;
> >
> > But when I do this, I'm stucked. The addr here is a SSA_NAME of
> > course. When I try to get the value that 'addr' points to through a
> > SSA_NAME as lhs like the code below, GCC reports an error.
> >
> > // get MASK_STORE
> > gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
> > tree addr = gimple_call_arg (stmt, 0);
> > tree mask = gimple_call_arg (stmt, 2);
> > tree rhs = gimple_call_arg (stmt, 3);
> >
> > // deref_ssa = *addr
> > tree deref_ssa = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
> > tree deref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
> > gimple *stmt1 = gimple_build_assign(deref_ssa, deref);
> >
> > // ssa1 = mask ? deref_ssa : rhs
> > tree cond = build3 (COND_EXPR, TREE_TYPE (rhs), mask, rhs, deref_ssa);
> > tree ssa1 = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
> > gimple *stmt2 = gimple_build_assign(ssa1, cond);
> >
> > // *addr = ssa1
> > tree indirect_ref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
> > gimple *stmt3 = gimple_build_assign(indirect_ref, ssa1);
> >
> > // insert stmts
> > gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
> > gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
> > gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
> >
> > // remove the origin MASK_STORE
> > gsi_remove (&gsi, true);
> >
> > The error:
> >
> > _588 = *_589;
> > _587 = _136 ? _272 : _588;
> > *_589 = _587;
> > unhandled expression in get_expr_operands():
> > <indirect_ref 0x7f25f5299880
> > type <real_type 0x7f25f57a12a0 float SF
> > size <integer_cst 0x7f25f5781e40 constant 32>
> > unit-size <integer_cst 0x7f25f5781e58 constant 4>
> > align:32 warn_if_not_align:0 symtab:0 alias-set 8
> > canonical-type 0x7f25f57a12a0 precision:32
> > pointer_to_this <pointer_type 0x7f25f57a1888>>
> >
> > arg:0 <ssa_name 0x7f25f4fbc948
> > type <pointer_type 0x7f25f57a1888 type <real_type 0x7f25f57a12a0 float>
> > public unsigned DI
> > size <integer_cst 0x7f25f5781c00 constant 64>
> > unit-size <integer_cst 0x7f25f5781c18 constant 8>
> > align:64 warn_if_not_align:0 symtab:0 alias-set 20
> > structural-equality>
> >
> > def_stmt _589 = &IMAGPART_EXPR <_452->amplitude>;
> > version:589
> > ptr-info 0x7f25f5716f18>>
> >
> > Is there a way to fix this?
>
> You need to use a MEM_REF , not an INDIRECT_REF
>
> > Thanks
> > Hanke Zhang
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Question on replacing .MASK_STORE with ternary expressions
2023-10-25 16:09 ` Hanke Zhang
@ 2023-10-25 16:51 ` Hanke Zhang
0 siblings, 0 replies; 4+ messages in thread
From: Hanke Zhang @ 2023-10-25 16:51 UTC (permalink / raw)
To: Richard Biener; +Cc: gcc
Hi RIchard:
Sorry about the previous mail. I made a mistake that I forgot the
MEM_REF requires two parameters.
After changing to the code here, everything is fine.
tree deref = build1 (MEM_REF , TREE_TYPE (deref_ssa), addr,
build_int_cst (TREE_TYPE (addr), 0));
// ...
tree indirect_ref = build1 (MEM_REF , TREE_TYPE (deref_ssa), addr,
build_int_cst (TREE_TYPE (addr), 0));
Thanks so much for your advice! That helps me a lot! :)
Thanks
Hanke Zhang
Hanke Zhang <hkzhang455@gmail.com> 于2023年10月26日周四 00:09写道:
>
> Hi Richard:
>
> I think I need to get the value that 'addr' points to, is MEM_REF really right?
>
> And I try to replace INDIRECT_REF with MEM_REF like this:
>
> tree deref = build1 (MEM_REF , TREE_TYPE (deref_ssa), addr);
> // ...
> tree indirect_ref = build1 (MEM_REF , TREE_TYPE (deref_ssa), addr);
>
> And the error is different, I think that means the type is not fit.
>
> 0x7afca4 build1(tree_code, tree_node*, tree_node*)
> ../../gcc/tree.cc:4968
> 0xe8292b replace_mask_store()
> ../../gcc/tree-if-conv.cc:3486
> 0xe8a03d execute
> ../../gcc/tree-if-conv.cc:3563
> 0xe8a03d execute
> ../../gcc/tree-if-conv.cc:3549
>
> Richard Biener <richard.guenther@gmail.com> 于2023年10月25日周三 23:40写道:
> >
> >
> >
> > > Am 25.10.2023 um 17:25 schrieb Hanke Zhang via Gcc <gcc@gcc.gnu.org>:
> > >
> > > Hi, I got a gimple relative question.
> > >
> > > I'm trying to replace the .MASK_STORE with a ternary expression in
> > > pass_ifcvt like below:
> > >
> > > .MASK_STORE(addr, align, mask, value) => *addr = mask ? value : *addr;
> > >
> > > But when I do this, I'm stucked. The addr here is a SSA_NAME of
> > > course. When I try to get the value that 'addr' points to through a
> > > SSA_NAME as lhs like the code below, GCC reports an error.
> > >
> > > // get MASK_STORE
> > > gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
> > > tree addr = gimple_call_arg (stmt, 0);
> > > tree mask = gimple_call_arg (stmt, 2);
> > > tree rhs = gimple_call_arg (stmt, 3);
> > >
> > > // deref_ssa = *addr
> > > tree deref_ssa = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
> > > tree deref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
> > > gimple *stmt1 = gimple_build_assign(deref_ssa, deref);
> > >
> > > // ssa1 = mask ? deref_ssa : rhs
> > > tree cond = build3 (COND_EXPR, TREE_TYPE (rhs), mask, rhs, deref_ssa);
> > > tree ssa1 = create_tmp_reg_or_ssa_name (TREE_TYPE (rhs), NULL);
> > > gimple *stmt2 = gimple_build_assign(ssa1, cond);
> > >
> > > // *addr = ssa1
> > > tree indirect_ref = build1 (INDIRECT_REF, TREE_TYPE (deref_ssa), addr);
> > > gimple *stmt3 = gimple_build_assign(indirect_ref, ssa1);
> > >
> > > // insert stmts
> > > gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
> > > gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
> > > gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
> > >
> > > // remove the origin MASK_STORE
> > > gsi_remove (&gsi, true);
> > >
> > > The error:
> > >
> > > _588 = *_589;
> > > _587 = _136 ? _272 : _588;
> > > *_589 = _587;
> > > unhandled expression in get_expr_operands():
> > > <indirect_ref 0x7f25f5299880
> > > type <real_type 0x7f25f57a12a0 float SF
> > > size <integer_cst 0x7f25f5781e40 constant 32>
> > > unit-size <integer_cst 0x7f25f5781e58 constant 4>
> > > align:32 warn_if_not_align:0 symtab:0 alias-set 8
> > > canonical-type 0x7f25f57a12a0 precision:32
> > > pointer_to_this <pointer_type 0x7f25f57a1888>>
> > >
> > > arg:0 <ssa_name 0x7f25f4fbc948
> > > type <pointer_type 0x7f25f57a1888 type <real_type 0x7f25f57a12a0 float>
> > > public unsigned DI
> > > size <integer_cst 0x7f25f5781c00 constant 64>
> > > unit-size <integer_cst 0x7f25f5781c18 constant 8>
> > > align:64 warn_if_not_align:0 symtab:0 alias-set 20
> > > structural-equality>
> > >
> > > def_stmt _589 = &IMAGPART_EXPR <_452->amplitude>;
> > > version:589
> > > ptr-info 0x7f25f5716f18>>
> > >
> > > Is there a way to fix this?
> >
> > You need to use a MEM_REF , not an INDIRECT_REF
> >
> > > Thanks
> > > Hanke Zhang
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-10-25 16:51 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-25 15:24 Question on replacing .MASK_STORE with ternary expressions Hanke Zhang
2023-10-25 15:40 ` Richard Biener
2023-10-25 16:09 ` Hanke Zhang
2023-10-25 16:51 ` Hanke Zhang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).