OptimizeNoopCopyExpression was sinking same-type bitcasts (e.g. bitcast i32 to i32) which would then be reintroduced by optimizePhiType, causing an infinite loop. Fix by adding a check (PhiTy == ConvertTy) in optimizePhiType to skip the conversion when types are already identical. Fixes #176688.