Compilers usually eliminate common subexpres-sions in intermediate code, not object code. This reduces machine-dependence but misses the machine-dependent common subexpressions introduced by the last phases of code expansion. This paper describes a machine-independent procedure for eliminating machine-specific common subexpressions. It also identifies dead variables, defines windows for a com-panion peephole optimizer, and forms the basis of a retargetable register allocator. Its techniques for han-dling machine-specific data should generalize to other optimizations as well.