Это должно быть:
asm volatile("lock; incq %0" : "+m" (val));
Указание отдельных операндов без ограничений, заставляющих вводить в то же место, что и вывод, может привести к коду, например:
val = something;
asm volatile("lock; incq %0" : "=m" (val) : "m"(val));
неправильно оптимизирован. Вам также может понадобиться клоббер памяти, чтобы предотвратить доступ к другим переменным, перемещаемым после asm.