https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51492
--- Comment #17 from Tamar Christina <tnfchris at gcc dot gnu.org> --- (In reply to Li Pan from comment #16) > I have a try like below and finally have the Standard Name "SAT_ADD". Could > you please help to double-check if my understanding is correct? > > Given below example code below: > > typedef unsigned int uint32_t; > > uint32_t > sat_add (uint32_t x, uint32_t y) > { > return (x + y) | - ((x + y) < x); > } > > And then add one simpify to match.pd and define new DEF_INTERNAL_OPTAB_FN > for it. Then we have the SAT_ADD representation after expand. > > uint32_t sat_add (uint32_t x, uint32_t y) > { > uint32_t _6; > > ;; basic block 2, loop depth 0 > ;; pred: ENTRY > _6 = .SAT_ADD (x_4(D), y_5(D)); [tail call] > return _6; > ;; succ: EXIT > > } > > If everything goes well, I will prepare the patch for it later. Thanks. Yeah that's looks right, I assume above you mean before expand? I believe saturating add is commutative but not associative, so you'd want to add it to commutative_binary_fn_p in internal-fn.cc. You may also want to provide some basic optimizations for it in match.pd such as .SAT_ADD (a, 0) = a. etc.