Soit le programme suivant :

int valeur;
volatile int bidule;
void toto() {
if (bidule) {
valeur = 65;
} else {
valeur = 33;
}
if (bidule) {
valeur++;
} else {
valeur--;
}
}

Pourquoi LLVM le compile-t-il ainsi :

define void @toto() #0 {
entry:
%0 = load volatile i32* @bidule, align 4, !tbaa !0
%tobool = icmp eq i32 %0, 0
%. = select i1 %tobool, i32 33, i32 65
store i32 %., i32* @valeur, align 4
%1 = load volatile i32* @bidule, align 4, !tbaa !0
%tobool1 = icmp eq i32 %1, 0
%storemerge5.v = select i1 %tobool1, i32 -1, i32 1
%storemerge5 = add i32 %storemerge5.v, %.
store i32 %storemerge5, i32* @valeur, align 4
ret void
}

Pourquoi met-il deux instructions STORE vers la même variable @valeur ?

Pourquoi ?

Pourquoi ??

N'ai-je donc tant vécu que pour cette infamie  ?