Во-первых, в чем смысл getelementptr i16* %ldcs0, i32 0
? Эти инструкции ничего не делают. И вы используете один и тот же базовый адрес и тот же индекс в два раза, так что ваш код эквивалентен
%ldcs.i8 = bitcast i16* %ldcs to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ldcs.i8, i8* %ldcs.i8 ,i32 2, i32 4, i1 false)
и имеющий точку источника и назначения указатели на том же месте, не допускается, как вы можете прочитать on the intrinsic's documentation:
Внутренние объекты 'llvm.memcpy.*
' копируют блок памяти из местоположения источника в место назначения, , которые не допускаются к перекрытию.
Таким образом, это может объяснить вашу ошибку. Даже если вы это исправить, чтобы использовать два разных местах, хотя, возможно, все еще потерпеть неудачу, если:
- Либо источник или память назначения не являются собственностью процесса
- Либо источник или память назначения не являются выровнены до 4 байтов, после того, как вы явно указано (в списке аргументов), что они
Наконец, вы на самом деле не нужно использовать memcpy
для копирования всего два байта, приведенный выше код может быть перезаписан, load i16*
, а затем store i16
.