Problem z dekodowaniem instrukcje x86 mają od 1 do 15 bajtów długości.
Pod jakim adresem znajduje się następna instrukcja?
Rozwiązanie: Pobieranie spod kilku adresów i potem selekcja właściwego.
Zagrożenia (hazard) danych
kolejna instrukcja zależy do wyników zwracanych przez poprzednią instrukcję.
movrbx, tab
moveax,[rbx+4]addeax,5mov[rbx+4],eax
Cały potok musi czekać na zakończenie pierwszej instrukcji.
Długie ciągi zależności kolejnych instrukcji powodują,
że w praktyce kolejne instrukcje są wykonywane sekwencyjnie zamiast równolegle.
Może pomóc: zmiana kolejności instrukcji, zmiana wykorzystywanych rejestrów.
Hazard RAW (read after write) i WAW (write after write).
Zagrożenia sterowania
modyfikacje rejestru IP poprzez skoki, wywołania funkcji powoduje,
że cały potok jest błędny (wstępnie przetworzone instrukcje zostały pobrane spod złego adresu)
i należy go wyczyścić a następnie rozpocząć przetwarzanie instrukcji spod nowego adresu.
Powoduje to duże opóźnienia: pobranie instrukcji z pamieci + pierwsza instrukcja trwa tyle cykli ile potok ma kroków.
Im dłuższy potok, tym dłuższe oczekiwanie.
Pomaga odpowiednie pisanie instrukcji warunkowych, pętli, stosowanie funkcji inline.
W procesorach implementowane jest spekulacyjne wykonanie kodu i przewidywanie rozgałęzień.