@@ -1040,3 +1040,65 @@ define <2 x i4> @negate_insertelement_nonnegatible_insert(<2 x i4> %src, i4 %a,
1040
1040
%t3 = sub <2 x i4 > %b , %t2
1041
1041
ret <2 x i4 > %t3
1042
1042
}
1043
+
1044
+ ; left-shift by constant can always be negated
1045
+ define i8 @negate_left_shift_by_constant_prefer_keeping_shl (i8 %x , i8 %y , i8 %z ) {
1046
+ ; CHECK-LABEL: @negate_left_shift_by_constant_prefer_keeping_shl(
1047
+ ; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Z:%.*]]
1048
+ ; CHECK-NEXT: call void @use8(i8 [[T0]])
1049
+ ; CHECK-NEXT: [[T1_NEG:%.*]] = shl i8 [[Z]], 4
1050
+ ; CHECK-NEXT: [[T2:%.*]] = add i8 [[T1_NEG]], [[X:%.*]]
1051
+ ; CHECK-NEXT: ret i8 [[T2]]
1052
+ ;
1053
+ %t0 = sub i8 0 , %z
1054
+ call void @use8 (i8 %t0 )
1055
+ %t1 = shl i8 %t0 , 4
1056
+ %t2 = sub i8 %x , %t1
1057
+ ret i8 %t2
1058
+ }
1059
+ define i8 @negate_left_shift_by_constant_prefer_keeping_shl_extrause (i8 %x , i8 %y , i8 %z ) {
1060
+ ; CHECK-LABEL: @negate_left_shift_by_constant_prefer_keeping_shl_extrause(
1061
+ ; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Z:%.*]]
1062
+ ; CHECK-NEXT: call void @use8(i8 [[T0]])
1063
+ ; CHECK-NEXT: [[T1:%.*]] = shl i8 [[T0]], 4
1064
+ ; CHECK-NEXT: call void @use8(i8 [[T1]])
1065
+ ; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
1066
+ ; CHECK-NEXT: ret i8 [[T2]]
1067
+ ;
1068
+ %t0 = sub i8 0 , %z
1069
+ call void @use8 (i8 %t0 )
1070
+ %t1 = shl i8 %t0 , 4
1071
+ call void @use8 (i8 %t1 )
1072
+ %t2 = sub i8 %x , %t1
1073
+ ret i8 %t2
1074
+ }
1075
+ define i8 @negate_left_shift_by_constant (i8 %x , i8 %y , i8 %z , i8 %k ) {
1076
+ ; CHECK-LABEL: @negate_left_shift_by_constant(
1077
+ ; CHECK-NEXT: [[T0:%.*]] = sub i8 [[K:%.*]], [[Z:%.*]]
1078
+ ; CHECK-NEXT: call void @use8(i8 [[T0]])
1079
+ ; CHECK-NEXT: [[T1:%.*]] = shl i8 [[T0]], 4
1080
+ ; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
1081
+ ; CHECK-NEXT: ret i8 [[T2]]
1082
+ ;
1083
+ %t0 = sub i8 %k , %z
1084
+ call void @use8 (i8 %t0 )
1085
+ %t1 = shl i8 %t0 , 4
1086
+ %t2 = sub i8 %x , %t1
1087
+ ret i8 %t2
1088
+ }
1089
+ define i8 @negate_left_shift_by_constant_extrause (i8 %x , i8 %y , i8 %z , i8 %k ) {
1090
+ ; CHECK-LABEL: @negate_left_shift_by_constant_extrause(
1091
+ ; CHECK-NEXT: [[T0:%.*]] = sub i8 [[K:%.*]], [[Z:%.*]]
1092
+ ; CHECK-NEXT: call void @use8(i8 [[T0]])
1093
+ ; CHECK-NEXT: [[T1:%.*]] = shl i8 [[T0]], 4
1094
+ ; CHECK-NEXT: call void @use8(i8 [[T1]])
1095
+ ; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
1096
+ ; CHECK-NEXT: ret i8 [[T2]]
1097
+ ;
1098
+ %t0 = sub i8 %k , %z
1099
+ call void @use8 (i8 %t0 )
1100
+ %t1 = shl i8 %t0 , 4
1101
+ call void @use8 (i8 %t1 )
1102
+ %t2 = sub i8 %x , %t1
1103
+ ret i8 %t2
1104
+ }
0 commit comments