Devoir is used here to express a probability.
- J’ai dû avoir l’air fatigué -> I probably looked tired
I don’t see much difference with :
- Je dois avoir eu l’air fatigué -> I might have looked tired
I would translate “I had to look tired” by Il fallait que j’aie l’air fatigué.
- J’ai pu le dire. is ambiguous, it can mean either “I might have said it” or “I was able to say it”.
- Je peux l’avoir dit. is not. It only means “I could have said it”.