@@ -388,10 +388,9 @@ define i8 @xor_shl(i8 %x, i8 %y, i8 %zarg, i8 %shamt) {
388388; CHECK-LABEL: define {{[^@]+}}@xor_shl
389389; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[ZARG:%.*]], i8 [[SHAMT:%.*]]) {
390390; CHECK-NEXT: [[Z:%.*]] = sdiv i8 42, [[ZARG]]
391- ; CHECK-NEXT: [[SX:%.*]] = shl i8 [[X]], [[SHAMT]]
392- ; CHECK-NEXT: [[SY:%.*]] = shl i8 [[Y]], [[SHAMT]]
393- ; CHECK-NEXT: [[A:%.*]] = xor i8 [[Z]], [[SX]]
394- ; CHECK-NEXT: [[R:%.*]] = xor i8 [[A]], [[SY]]
391+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X]], [[Y]]
392+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i8 [[TMP1]], [[SHAMT]]
393+ ; CHECK-NEXT: [[R:%.*]] = xor i8 [[TMP2]], [[Z]]
395394; CHECK-NEXT: ret i8 [[R]]
396395;
397396 %z = sdiv i8 42 , %zarg ; thwart complexity-based canonicalization
@@ -406,10 +405,9 @@ define i8 @and_lshr(i8 %x, i8 %y, i8 %zarg, i8 %shamt) {
406405; CHECK-LABEL: define {{[^@]+}}@and_lshr
407406; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[ZARG:%.*]], i8 [[SHAMT:%.*]]) {
408407; CHECK-NEXT: [[Z:%.*]] = sdiv i8 42, [[ZARG]]
409- ; CHECK-NEXT: [[SX:%.*]] = lshr i8 [[X]], [[SHAMT]]
410- ; CHECK-NEXT: [[SY:%.*]] = lshr i8 [[Y]], [[SHAMT]]
411- ; CHECK-NEXT: [[A:%.*]] = and i8 [[Z]], [[SX]]
412- ; CHECK-NEXT: [[R:%.*]] = and i8 [[SY]], [[A]]
408+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], [[Y]]
409+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
410+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[TMP2]], [[Z]]
413411; CHECK-NEXT: ret i8 [[R]]
414412;
415413 %z = sdiv i8 42 , %zarg ; thwart complexity-based canonicalization
@@ -435,6 +433,51 @@ define i8 @or_lshr(i8 %x, i8 %y, i8 %z, i8 %shamt) {
435433 ret i8 %r
436434}
437435
436+ define i8 @or_lshr_commuted1 (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
437+ ; CHECK-LABEL: define {{[^@]+}}@or_lshr_commuted1
438+ ; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
439+ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], [[Y]]
440+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
441+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[TMP2]], [[Z]]
442+ ; CHECK-NEXT: ret i8 [[R]]
443+ ;
444+ %sx = lshr i8 %x , %shamt
445+ %sy = lshr i8 %y , %shamt
446+ %a = or i8 %z , %sx
447+ %r = or i8 %sy , %a
448+ ret i8 %r
449+ }
450+
451+ define i8 @or_lshr_commuted2 (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
452+ ; CHECK-LABEL: define {{[^@]+}}@or_lshr_commuted2
453+ ; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
454+ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], [[Y]]
455+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
456+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[TMP2]], [[Z]]
457+ ; CHECK-NEXT: ret i8 [[R]]
458+ ;
459+ %sx = lshr i8 %x , %shamt
460+ %sy = lshr i8 %y , %shamt
461+ %a = or i8 %z , %sx
462+ %r = or i8 %a , %sy
463+ ret i8 %r
464+ }
465+
466+ define i8 @or_lshr_commuted3 (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
467+ ; CHECK-LABEL: define {{[^@]+}}@or_lshr_commuted3
468+ ; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
469+ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], [[Y]]
470+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
471+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[TMP2]], [[Z]]
472+ ; CHECK-NEXT: ret i8 [[R]]
473+ ;
474+ %sx = lshr i8 %x , %shamt
475+ %sy = lshr i8 %y , %shamt
476+ %a = or i8 %sx , %z
477+ %r = or i8 %a , %sy
478+ ret i8 %r
479+ }
480+
438481define i8 @xor_lshr (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
439482; CHECK-LABEL: define {{[^@]+}}@xor_lshr
440483; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
0 commit comments