Loop optimization (invariant code motion) in Compiler Design - Time & Space Complexity
When a program runs a loop, some calculations inside might not need to be repeated every time. Moving these out can save time.
We want to see how this change affects the total work done as the loop grows.
Analyze the time complexity of the following code snippet.
for (int i = 0; i < n; i++) {
int x = a + b; // invariant calculation
arr[i] = x * i;
}
This loop calculates the same sum a + b every time, then uses it to update an array.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The loop runs
ntimes. - How many times: The addition
a + bis done inside the loop, repeatingntimes.
Each time the loop runs, it does the addition and a multiplication.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 operations (10 additions + 10 multiplications) |
| 100 | About 200 operations |
| 1000 | About 2000 operations |
Pattern observation: The total work grows directly with n. Doubling n doubles the work.
Time Complexity: O(n)
This means the time to run the loop grows in a straight line as the input size increases.
[X] Wrong: "Doing the same calculation inside the loop doesn't affect performance much."
[OK] Correct: Even small repeated work adds up when the loop runs many times, making the program slower.
Understanding how moving repeated work outside loops saves time shows you can write efficient code, a skill valued in many programming tasks.
"What if the calculation inside the loop depends on the loop variable? How would that affect the time complexity?"
Practice
loop optimization (invariant code motion) in compiler design?Solution
Step 1: Understand loop invariant code
Loop invariant code means calculations inside a loop that produce the same result every time.Step 2: Purpose of moving invariant code
Moving such code outside the loop avoids repeating the same calculation, saving time.Final Answer:
To move calculations that do not change outside the loop to improve efficiency -> Option AQuick Check:
Invariant code motion = move unchanging code outside loop [OK]
- Thinking loop optimization adds more loops
- Believing invariant code should stay inside loops
- Confusing optimization with removing loops
Solution
Step 1: Identify invariant calculation
The calculation 5 * 3 does not depend on the loop variable i, so it is invariant.Step 2: Check code placement
x = 5 * 3 for i in range(n): print(i + x) moves 5 * 3 outside the loop, calculating it once before looping.Final Answer:
x = 5 * 3 for i in range(n): print(i + x) -> Option DQuick Check:
Invariant code outside loop = x = 5 * 3 for i in range(n): print(i + x) [OK]
- Calculating invariant code inside the loop repeatedly
- Moving variable-dependent code outside the loop
- Ignoring the loop variable dependency
sum = 0
for i in range(1, 5):
x = 10 * 2
sum += i + x
print(sum)What will be the output after applying invariant code motion optimization?
Solution
Step 1: Move invariant calculation outside loop
Calculate x = 10 * 2 = 20 once before the loop.Step 2: Calculate sum with optimized code
sum = 0; loop i=1 to 4: sum += i + 20
Sum = (1+20)+(2+20)+(3+20)+(4+20) = 21+22+23+24 = 90Final Answer:
90 -> Option CQuick Check:
Sum of (i+20) for i=1 to 4 = 90 [OK]
- Adding 10*2 inside loop each time
- Miscounting loop iterations
- Forgetting to add i in sum
for i in range(3):
y = i * 2
x = 4 + 5
print(x + y)What is the problem if we move
x = 4 + 5 inside the loop?Solution
Step 1: Analyze variable dependency
x = 4 + 5 is invariant; it does not depend on i.Step 2: Effect of moving x inside loop
Moving x inside loop causes repeated calculation each iteration, wasting resources.Final Answer:
Moving x inside loop causes repeated calculation, reducing efficiency -> Option AQuick Check:
Invariant code inside loop = inefficient [OK]
- Thinking invariant code depends on loop variable
- Believing repeated calculation improves speed
- Confusing variable scope with optimization
for i in range(3):
for j in range(4):
x = 2 * 3
y = i + j
print(x + y)Solution
Step 1: Identify invariant expressions
x = 2 * 3 is invariant (does not depend on i or j). y = i + j depends on both loop variables.Step 2: Apply invariant code motion
Move x outside both loops to calculate once. y must stay inside inner loop as it changes each iteration.Final Answer:
Move x outside both loops, keep y inside inner loop -> Option BQuick Check:
Invariant x outside loops, variable y inside loop [OK]
- Moving variable-dependent code outside loops
- Keeping invariant code inside loops unnecessarily
- Confusing which variables depend on loop indices
Ready to prove it?
Pass the test and this pattern moves unknown
