Да; это нарушает строгие правила наложения имен. Два разных типа не могут указывать на одно и то же место в памяти. Здесь у вас есть x, указывающий на ввод, и y, указывающий на вывод, но они бывают разных типов.
Вы можете изменить сигнатуру своей функции, чтобы она принимала параметры __m128 *, но, вероятно, проще всего это оставить. Скорее всего, все будет работать нормально, если вы будете осторожны, если аргументы ввода / вывода указывают на память с соответствующими ограничениями выравнивания и размера (т.е. они должны каждый указывать на что-то, где ваш цикл не индексируется в конце, или загружать неинициализированные данные .)