On Thu, Jul 24, 2025 at 8:40 AM Richard Biener <richard.guent...@gmail.com> wrote: > > On Thu, Jul 24, 2025 at 2:39 AM magic0826gc via Gcc <gcc@gcc.gnu.org> wrote: > > > > Dear GCC Developers, > > I'm writing to report an observation regarding loop unswitching behavior > > when compiling the attached code with GCC 15 using -O2 -funswitch-loops > > optimization flags. Here's a detailed analysis of the issue: > > Code Overview: > > int > > foo(double *a, double *b, double *c, double *d, double *r, int size, int > > order) > > { > > for (int i = 0; i < size; i++) > > { > > double tmp; > > if (order < 3) > > tmp = -8 * a[i]; > > else > > tmp = -4 * b[i]; > > double x = 3 * tmp + d[i] + tmp; > > if (5 > order) > > x = 2; > > if (order == 12345) > > x = 5; > > for (int j = 0; j < size; j++) > > { > > double y = 3.4f * tmp + d[i]; > > r[j] += x + y; > > } > > } > > return 0; > > } > > Outer loop with multiple conditional checks on 'order' parameter. > > Complex control flow with three independent conditionals. > > Inner loop containing runtime-invariant computations. > > Observed Behavior: > > The compiler fails to unswitch the outer loop despite the presence of > > multiple loop-invariant conditions. This prevents: > > Constant propagation of 'x' variable. Elimination of dead code paths (order > > == 12345 and 5 > order check). > > Current unswitching (tree_unswitch_outer_loop) appears limited to inner > > loop guards. What prevents handling nested loops with complex control flow? > > Potential Constraints: > > Register pressure considerations in multi-versioned loops. Code size > > explosion vs. runtime tradeoffs. Interaction with subsequent optimization > > passes. > > Could you help clarify: > > Architectural constraints in current unswitching implementation? > > Planned improvements for nested loop optimization? > > Unswitching does currently not implement unswitching of non-innermost > loops. A quick > search in bugzilla doesn't reveal a bug where the summary notes this > so I suggest > you file a bugzilla for this.
Actually I stand corrected - I implemented unswitching of outer loops a few years ago, but it only unswitches inner loop invariant conditions, never on conditions that appear in an outer loop. > > Recommended workarounds for such patterns? > > You'd have to manually unswitch the outer loop. > > Richard. > > > Thank you for your time and expertise. I'd be happy to provide additional > > details if needed. > > Best regards,