Ещё, у Никиты Попова есть статья про llvm, там приводится пример кодген теста. И тоже непонятно, что он тестирует. Там правка заключалась в преобразовании A + (B & ~A) в A | (B & ~A), а потом и в A | B. Но в тесте этого нет, насколько вижу, что в IR A + (B & ~A), что в CHECK то же A + (B & ~A)
define i8 @add_and_xor(i8 %x, i8 %y) {
; CHECK-LABEL: @add_and_xor(
; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X:%.*]], -1
; CHECK-NEXT: [[AND:%.*]] = and i8 [[XOR]], [[Y:%.*]]
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[AND]], [[X]]
; CHECK-NEXT: ret i8 [[ADD]]
;
%xor = xor i8 %x, -1
%and = and i8 %xor, %y
%add = add i8 %and, %x
ret i8 %add
}