3 ms·
Your explanation is completely insane. > but Turing tought us that is indeed a hard task! Analyzing whether a bounded loop terminates is impossible, got it.
by imtringued 6d ago
Your explanation is completely insane.
> but Turing tought us that is indeed a hard task!
Analyzing whether a bounded loop terminates is impossible, got it.
>Or it could decide to apply it by default and accept that in those cases the program does something different than what the source code says. The latter is better known as UB.
But the reason why it lets the compiler fuse the loops has nothing to do with whether the loop terminates or not. The infinite loop UB is just a way of adding more UB and then invoking non infinite loop optimization.
We don't know if A[i] aliases with the pointer that stores the address of the B array and note I mean B itself not A and B overlapping. It could also alias with the loop bound. So the first loop must run until completion simply because it could accidentally overwrite a pointer or variable that is used in the second loop.
But now that we have infinite loop UB we can ignore all of that and it's not because infinite loops themselves produce optimization potential, it's because more stuff is UB now so the compiler is allowed to break aliasing rules, which is the actual thing that was preventing the optimization. The infinite loop UB is just the permission slip.
- teo_zero 6d agoWhenever you write a succinct example or a metaphor to try to explain in a few words a complicated concept, someone will nitpick small details of your construction, thus focusing on the form and missing the spirit! Forget if "i<n" is decidable or not: the sense is that there will always be some loops that the compiler can't determine if it's finite or not. Forget if A and B can alias or not: the sense is having two independent actions that can be executed in the same loop or in two consecutive loops. Let's see... what about the following example, that replaces all a's with @ and all e's with & in a zero-terminated string s? for (char *p=s; *p; p++) if (*p=='a') *p='@'; for (char *p=s; *p; p++) if (*p=='e') *p='&'; If a compiler is allowed to assume that the first loop terminates, then it may optimize it to: for (char *p=s; *p; p++) { if (*p=='a') *p='@'; if (*p=='e') *p='&'; } Is this explanation less insane?