Q:

Сложение volatile - UB?

Содержит ли следующая программа UB?
#include <iostream>

volatile int x;

int main() {
  std::cout << (x + x);
}

A:

Да, содержит. Несколько доступов к одному и тому же volatile объекту без упорядочения этих доступов (unsequenced access) - неопределенное поведение.
Доступ к volatile объектам испокон веков является частью наблюдаемого поведения (observable behavior) С++ программы. Поэтому доступ к volatile объекту (даже только на чтение) формально считается побочным эффектом (side effect) содержащего этот доступ выражения. А далее уже работает общая схема: наличие в выражении неупорядоченных побочных эффектов, воздействующих на один и тот же объект - это неопределенное поведение.

[n4659]
4.6 Program execution [intro.execution]
14 Reading an object designated by a volatile glvalue (6.10), modifying an object, calling a library I/O function, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment.[...]
17 [...]If a side effect on a memory location (4.4) is unsequenced relative to either another side effect on the same memory location or a value computation using the value of any object in the same memory location, and they are not potentially concurrent (4.7), the behavior is undefined.[...]

В новой структуре документа:
http://eel.is/c++draft/basic.exec#intro.execution-7
http://eel.is/c++draft/basic.exec#intro.execution-10

