There doesn't seem to be any description of why this refactoring. So why? :)
The adding of the else argument is fine. Thanks, Tamar > -----Original Message----- > From: Alfie Richards <[email protected]> > Sent: 08 August 2026 00:11 > To: [email protected] > Cc: Alex Coplan <[email protected]>; Alice Carlotti > <[email protected]>; [email protected]; > [email protected]; Tamar Christina <[email protected]>; > [email protected]; [email protected]; [email protected]; Alfie > Richards <[email protected]> > Subject: [PATCH v2 03/13] aarch64: Add fold_contiguous_load helper > function. > > gcc/ChangeLog: > > * config/aarch64/aarch64-acle-builtins.cc > (gimple_folder::fold_contiguous_load): New function. > * config/aarch64/aarch64-acle-builtins.h > (gimple_folder::fold_contiguous_load): New function. > * config/aarch64/aarch64-sve-builtins-base.cc: > (svld1_impl::fold): Change to use fold_contiguous_load. > (svldxf1_extend_impl::fold): Change to use fold_contiguous_load. > * config/aarch64/aarch64-sve.md > (aarch64_ld<fn>f1_<ANY_EXTEND:optab><SVE_HSDI:mode><SVE_PA > RTIAL_I:mode>): > Add else operand. > > Co-Authored-By: Alex Coplan <[email protected]> > --- > gcc/config/aarch64/aarch64-acle-builtins.cc | 24 +++++++++++++++++++ > gcc/config/aarch64/aarch64-acle-builtins.h | 1 + > .../aarch64/aarch64-sve-builtins-base.cc | 20 ++-------------- > gcc/config/aarch64/aarch64-sve.md | 1 + > 4 files changed, 28 insertions(+), 18 deletions(-) > > diff --git a/gcc/config/aarch64/aarch64-acle-builtins.cc > b/gcc/config/aarch64/aarch64-acle-builtins.cc > index 98ba6c8d347..cf746171b4c 100644 > --- a/gcc/config/aarch64/aarch64-acle-builtins.cc > +++ b/gcc/config/aarch64/aarch64-acle-builtins.cc > @@ -2850,6 +2850,30 @@ gimple_folder::fold_contiguous_base (gimple_seq > &stmts, tree vectype) > return base; > } > > +/* Common code to fold a contiguous load intrinsic call into a gimple > + call to IFN_CODE. */ > +gimple * > +gimple_folder::fold_contiguous_load (internal_fn ifn_code) > +{ > + if (vectors_per_tuple () != 1) > + return nullptr; > + > + tree vectype = vector_type (0); > + > + /* Get the predicate and base pointer. */ > + gimple_seq stmts = NULL; > + tree pred = convert_pred (stmts, vectype, 0); > + tree base = fold_contiguous_base (stmts, vectype); > + tree els = build_zero_cst (vectype); > + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); > + > + tree cookie = load_store_cookie (TREE_TYPE (vectype)); > + gcall *new_call = gimple_build_call_internal (ifn_code, 4, > + base, cookie, pred, els); > + gimple_call_set_lhs (new_call, lhs); > + return new_call; > +} > + > /* Return the alignment and TBAA argument to an internal load or store > function like IFN_MASK_LOAD or IFN_MASK_STORE, given that it accesses > memory elements of type TYPE. */ > diff --git a/gcc/config/aarch64/aarch64-acle-builtins.h > b/gcc/config/aarch64/aarch64-acle-builtins.h > index 42150a2632b..4ce860450bb 100644 > --- a/gcc/config/aarch64/aarch64-acle-builtins.h > +++ b/gcc/config/aarch64/aarch64-acle-builtins.h > @@ -650,6 +650,7 @@ public: > tree force_vector (gimple_seq &, tree, tree); > tree convert_pred (gimple_seq &, tree, unsigned int); > tree fold_contiguous_base (gimple_seq &, tree); > + gimple *fold_contiguous_load (internal_fn); > tree load_store_cookie (tree); > > gcall *redirect_call (const function_instance &); > diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.cc > b/gcc/config/aarch64/aarch64-sve-builtins-base.cc > index 5d01d875a9d..800541a9262 100644 > --- a/gcc/config/aarch64/aarch64-sve-builtins-base.cc > +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.cc > @@ -1704,23 +1704,7 @@ public: > gimple * > fold (gimple_folder &f) const override > { > - if (f.vectors_per_tuple () != 1) > - return nullptr; > - > - tree vectype = f.vector_type (0); > - > - /* Get the predicate and base pointer. */ > - gimple_seq stmts = NULL; > - tree pred = f.convert_pred (stmts, vectype, 0); > - tree base = f.fold_contiguous_base (stmts, vectype); > - tree els = build_zero_cst (vectype); > - gsi_insert_seq_before (f.gsi, stmts, GSI_SAME_STMT); > - > - tree cookie = f.load_store_cookie (TREE_TYPE (vectype)); > - gcall *new_call = gimple_build_call_internal (IFN_MASK_LOAD, 4, > - base, cookie, pred, els); > - gimple_call_set_lhs (new_call, f.lhs); > - return new_call; > + return f.fold_contiguous_load (IFN_MASK_LOAD); > } > > rtx > @@ -2108,7 +2092,7 @@ public: > insn_code icode = code_for_aarch64_ldf1 (m_unspec, extend_rtx_code (), > e.vector_mode (0), > e.memory_vector_mode ()); > - return e.use_contiguous_load_insn (icode); > + return e.use_contiguous_load_insn (icode, true); > } > > /* The unspec associated with the load. */ > diff --git a/gcc/config/aarch64/aarch64-sve.md > b/gcc/config/aarch64/aarch64-sve.md > index 3f59aa77437..878dadf6f61 100644 > --- a/gcc/config/aarch64/aarch64-sve.md > +++ b/gcc/config/aarch64/aarch64-sve.md > @@ -1487,6 +1487,7 @@ (define_insn_and_rewrite > "@aarch64_ld<fn>f1_<ANY_EXTEND:optab><SVE_HSDI:mode><SV > (unspec:SVE_PARTIAL_I > [(match_operand:<SVE_PARTIAL_I:VPRED> 2 "register_operand" > "Upl") > (match_operand:SVE_PARTIAL_I 1 > "aarch64_sve_ld<fn>f1_operand" "Ut<fn>") > + (match_operand:SVE_PARTIAL_I 4 > "aarch64_maskload_else_operand") > (reg:VNx16BI FFRT_REGNUM)] > SVE_LDFF1_LDNF1))] > UNSPEC_PRED_X))] > -- > 2.43.0
