Рубрики

ВОРОТА | GATE CS 2013 | Вопрос 48

Следующий фрагмент кода выполняется на процессоре, который разрешает регистрировать только операнды в своих инструкциях. Каждая инструкция может иметь не более двух исходных операндов и одного целевого операнда. Предположим, что все переменные мертвы после этого сегмента кода.

   c = a + b;
   d = c * a;
   e = c + a;
   x = c * c;
   if (x > a) {
      y = a * a;
   }
   else {
     d = d * d;
     e = e * e;
  }

Предположим, что архитектура набора команд процессора имеет только два регистра. Единственная разрешенная оптимизация компилятора — это движение кода, которое перемещает операторы из одного места в другое, сохраняя при этом правильность. Каково минимальное количество разливов в память в скомпилированном коде?

(А) 0
(Б) 1
(С) 2
(D) 3

Ответ: (Б)
Объяснение:

r1......r2
a.......b......c = a + b
a.......c......x = c * c
a.......x......but we will have to store c in mem as we don't know if x > a
................. or not
y.......x......y = a * a
choosing the best case of x > a , min spills = 1 

Тест на этот вопрос

Рекомендуемые посты:

ВОРОТА | GATE CS 2013 | Вопрос 48

0.00 (0%) 0 votes