One great example to try: add -O3 to the compiler options, then write a function returning its argument multiplied by 2, 3, 4, ...
You'll see the various ways the compiler avoids emitting an actual multiplication instruction. The smallest multiplier I found that actually produced an imul: 46.