3 ms·
So fun fact, if you compile int sum(int n) { int sum = 0; for(int i = 0; i < n; i++) { sum +=i; } return sum; } clang, w
by archgoon 2y ago
So fun fact, if you compile
int sum(int n) {
int sum = 0;
for(int i = 0; i < n; i++) {
sum +=i;
}
return sum;
}
clang, with -O2, will turn this into the polynomial (n+1)*n//2. It can also do similar transformations for multiple loops.
https://godbolt.org/z/so6neac33 https://godbolt.org/z/so6neac33
So if you do a brute force solution which could have been reduced to a polyomial, clang has a shot of doing just that.
- j2kun 2y agoI believe the term for this is scalar evolution.
- archgoon 2y agoYep! That is it alright. Here's a talk from an llvm conference with the details. https://www.youtube.com/watch?v=AmjliNp0_00 https://www.youtube.com/watch?v=AmjliNp0_00
- sbrother 2y agoThat is mind blowing, but it’s not immediately obvious to me that it’s equivalent for n > sqrt(INT_MAX). Is it? And if so, is the compiler somehow smart enough to know that?