define i4 @scalar0 (i4 %x, i4 %y) {
; CHECK-LABEL: @scalar0(
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], 1
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[X:%.*]], 1
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[Y:%.*]], -2
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%n0 = xor i4 %x, %y
define i4 @scalar1 (i4 %x, i4 %y) {
; CHECK-LABEL: @scalar1(
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[X:%.*]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[Y:%.*]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%n0 = xor i4 %x, %y
define i4 @c_1_0_0 (i4 %x, i4 %y) {
; CHECK-LABEL: @c_1_0_0(
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[Y:%.*]], [[X:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[X:%.*]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[Y:%.*]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%n0 = xor i4 %y, %x ; swapped order
define i4 @c_0_1_0 (i4 %x, i4 %y) {
; CHECK-LABEL: @c_0_1_0(
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[N1]], [[X]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[Y:%.*]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[X:%.*]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%n0 = xor i4 %x, %y
; CHECK-LABEL: @c_0_0_1(
; CHECK-NEXT: [[X:%.*]] = call i4 @gen4()
; CHECK-NEXT: [[Y:%.*]] = call i4 @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[X]], [[Y]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[Y]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[X]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[Y]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%x = call i4 @gen4()
define i4 @c_1_1_0 (i4 %x, i4 %y) {
; CHECK-LABEL: @c_1_1_0(
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[Y:%.*]], [[X:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[N1]], [[X]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[Y:%.*]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[X:%.*]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%n0 = xor i4 %y, %x ; swapped order
define i4 @c_1_0_1 (i4 %x) {
; CHECK-LABEL: @c_1_0_1(
; CHECK-NEXT: [[Y:%.*]] = call i4 @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[Y]], [[X:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[Y]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[X:%.*]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[Y]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%y = call i4 @gen4()
define i4 @c_0_1_1 (i4 %y) {
; CHECK-LABEL: @c_0_1_1(
; CHECK-NEXT: [[X:%.*]] = call i4 @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[X]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[X]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[Y:%.*]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[X]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%x = call i4 @gen4()
; CHECK-LABEL: @c_1_1_1(
; CHECK-NEXT: [[X:%.*]] = call i4 @gen4()
; CHECK-NEXT: [[Y:%.*]] = call i4 @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor i4 [[Y]], [[X]]
-; CHECK-NEXT: [[N1:%.*]] = and i4 [[N0]], -2
-; CHECK-NEXT: [[R:%.*]] = xor i4 [[X]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[Y]], -2
+; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[X]], 1
+; CHECK-NEXT: [[R:%.*]] = or i4 [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret i4 [[R]]
;
%x = call i4 @gen4()
define <2 x i4> @splat (<2 x i4> %x, <2 x i4> %y) {
; CHECK-LABEL: @splat(
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[X:%.*]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[Y:%.*]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%n0 = xor <2 x i4> %x, %y
define <3 x i4> @splat_undef (<3 x i4> %x, <3 x i4> %y) {
; CHECK-LABEL: @splat_undef(
-; CHECK-NEXT: [[N0:%.*]] = xor <3 x i4> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <3 x i4> [[N0]], <i4 -2, i4 undef, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <3 x i4> [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <3 x i4> [[X:%.*]], <i4 -2, i4 undef, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <3 x i4> [[Y:%.*]], <i4 1, i4 undef, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <3 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <3 x i4> [[R]]
;
%n0 = xor <3 x i4> %x, %y
define <2 x i4> @nonsplat (<2 x i4> %x, <2 x i4> %y) {
; CHECK-LABEL: @nonsplat(
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 1>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[X:%.*]], <i4 -2, i4 1>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[Y:%.*]], <i4 1, i4 -2>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%n0 = xor <2 x i4> %x, %y
define <2 x i4> @in_constant_varx_14_nonsplat(<2 x i4> %x, <2 x i4> %mask) {
; CHECK-LABEL: @in_constant_varx_14_nonsplat(
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[X:%.*]], <i4 -2, i4 7>
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 1, i4 1>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], <i4 -2, i4 7>
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[X:%.*]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], <i4 -2, i4 6>
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%n0 = xor <2 x i4> %x, <i4 14, i4 7> ; %x
define <3 x i4> @in_constant_varx_14_undef(<3 x i4> %x, <3 x i4> %mask) {
; CHECK-LABEL: @in_constant_varx_14_undef(
-; CHECK-NEXT: [[N0:%.*]] = xor <3 x i4> [[X:%.*]], <i4 -2, i4 undef, i4 7>
-; CHECK-NEXT: [[N1:%.*]] = and <3 x i4> [[N0]], <i4 1, i4 undef, i4 1>
-; CHECK-NEXT: [[R:%.*]] = xor <3 x i4> [[N1]], <i4 -2, i4 undef, i4 7>
+; CHECK-NEXT: [[TMP1:%.*]] = and <3 x i4> [[X:%.*]], <i4 1, i4 undef, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <3 x i4> [[TMP1]], <i4 -2, i4 undef, i4 6>
; CHECK-NEXT: ret <3 x i4> [[R]]
;
%n0 = xor <3 x i4> %x, <i4 14, i4 undef, i4 7> ; %x
define <2 x i4> @in_constant_14_vary_nonsplat(<2 x i4> %y, <2 x i4> %mask) {
; CHECK-LABEL: @in_constant_14_vary_nonsplat(
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[Y:%.*]], <i4 -2, i4 7>
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 1, i4 1>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[Y:%.*]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], <i4 0, i4 1>
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%n0 = xor <2 x i4> %y, <i4 14, i4 7> ; %x
define <3 x i4> @in_constant_14_vary_undef(<3 x i4> %y, <3 x i4> %mask) {
; CHECK-LABEL: @in_constant_14_vary_undef(
-; CHECK-NEXT: [[N0:%.*]] = xor <3 x i4> [[Y:%.*]], <i4 -2, i4 undef, i4 7>
-; CHECK-NEXT: [[N1:%.*]] = and <3 x i4> [[N0]], <i4 1, i4 undef, i4 1>
-; CHECK-NEXT: [[R:%.*]] = xor <3 x i4> [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <3 x i4> [[Y:%.*]], <i4 -2, i4 undef, i4 -2>
+; CHECK-NEXT: [[R:%.*]] = or <3 x i4> [[TMP1]], <i4 0, i4 undef, i4 1>
; CHECK-NEXT: ret <3 x i4> [[R]]
;
%n0 = xor <3 x i4> %y, <i4 14, i4 undef, i4 7> ; %x
define <2 x i4> @c_1_0_0 (<2 x i4> %x, <2 x i4> %y) {
; CHECK-LABEL: @c_1_0_0(
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[Y:%.*]], [[X:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[Y]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[X:%.*]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[Y:%.*]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%n0 = xor <2 x i4> %y, %x ; swapped order
define <2 x i4> @c_0_1_0 (<2 x i4> %x, <2 x i4> %y) {
; CHECK-LABEL: @c_0_1_0(
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[X]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[Y:%.*]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[X:%.*]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%n0 = xor <2 x i4> %x, %y
; CHECK-LABEL: @c_0_0_1(
; CHECK-NEXT: [[X:%.*]] = call <2 x i4> @gen4()
; CHECK-NEXT: [[Y:%.*]] = call <2 x i4> @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[X]], [[Y]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[Y]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[X]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[Y]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%x = call <2 x i4> @gen4()
define <2 x i4> @c_1_1_0 (<2 x i4> %x, <2 x i4> %y) {
; CHECK-LABEL: @c_1_1_0(
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[Y:%.*]], [[X:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[N1]], [[X]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[Y:%.*]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[X:%.*]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%n0 = xor <2 x i4> %y, %x ; swapped order
define <2 x i4> @c_1_0_1 (<2 x i4> %x) {
; CHECK-LABEL: @c_1_0_1(
; CHECK-NEXT: [[Y:%.*]] = call <2 x i4> @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[Y]], [[X:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[Y]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[X:%.*]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[Y]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%y = call <2 x i4> @gen4()
define <2 x i4> @c_0_1_1 (<2 x i4> %y) {
; CHECK-LABEL: @c_0_1_1(
; CHECK-NEXT: [[X:%.*]] = call <2 x i4> @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[X]], [[Y:%.*]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[X]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[Y:%.*]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[X]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%x = call <2 x i4> @gen4()
; CHECK-LABEL: @c_1_1_1(
; CHECK-NEXT: [[X:%.*]] = call <2 x i4> @gen4()
; CHECK-NEXT: [[Y:%.*]] = call <2 x i4> @gen4()
-; CHECK-NEXT: [[N0:%.*]] = xor <2 x i4> [[Y]], [[X]]
-; CHECK-NEXT: [[N1:%.*]] = and <2 x i4> [[N0]], <i4 -2, i4 -2>
-; CHECK-NEXT: [[R:%.*]] = xor <2 x i4> [[X]], [[N1]]
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i4> [[Y]], <i4 -2, i4 -2>
+; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i4> [[X]], <i4 1, i4 1>
+; CHECK-NEXT: [[R:%.*]] = or <2 x i4> [[TMP1]], [[TMP2]]
; CHECK-NEXT: ret <2 x i4> [[R]]
;
%x = call <2 x i4> @gen4()