@@ -3986,5 +3986,84 @@ define i32 @add_reduce_sqr_sum_varC_invalid2(i32 %a, i32 %b) {
39863986 ret i32 %ab2
39873987}
39883988
3989+ define i32 @fold_sext_addition_or_disjoint (i8 %x ) {
3990+ ; CHECK-LABEL: @fold_sext_addition_or_disjoint(
3991+ ; CHECK-NEXT: [[XX:%.*]] = or disjoint i8 [[X:%.*]], 12
3992+ ; CHECK-NEXT: [[SE:%.*]] = sext i8 [[XX]] to i32
3993+ ; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], 1234
3994+ ; CHECK-NEXT: ret i32 [[R]]
3995+ ;
3996+ %xx = or disjoint i8 %x , 12
3997+ %se = sext i8 %xx to i32
3998+ %r = add i32 %se , 1234
3999+ ret i32 %r
4000+ }
4001+
4002+ define i32 @fold_sext_addition_fail (i8 %x ) {
4003+ ; CHECK-LABEL: @fold_sext_addition_fail(
4004+ ; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 12
4005+ ; CHECK-NEXT: [[SE:%.*]] = sext i8 [[XX]] to i32
4006+ ; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], 1234
4007+ ; CHECK-NEXT: ret i32 [[R]]
4008+ ;
4009+ %xx = or i8 %x , 12
4010+ %se = sext i8 %xx to i32
4011+ %r = add i32 %se , 1234
4012+ ret i32 %r
4013+ }
4014+
4015+ define i32 @fold_zext_addition_or_disjoint (i8 %x ) {
4016+ ; CHECK-LABEL: @fold_zext_addition_or_disjoint(
4017+ ; CHECK-NEXT: [[XX:%.*]] = or disjoint i8 [[X:%.*]], 12
4018+ ; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4019+ ; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[SE]], 1234
4020+ ; CHECK-NEXT: ret i32 [[R]]
4021+ ;
4022+ %xx = or disjoint i8 %x , 12
4023+ %se = zext i8 %xx to i32
4024+ %r = add i32 %se , 1234
4025+ ret i32 %r
4026+ }
4027+
4028+ define i32 @fold_zext_addition_or_disjoint2 (i8 %x ) {
4029+ ; CHECK-LABEL: @fold_zext_addition_or_disjoint2(
4030+ ; CHECK-NEXT: [[XX:%.*]] = or disjoint i8 [[X:%.*]], 18
4031+ ; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4032+ ; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], -14
4033+ ; CHECK-NEXT: ret i32 [[R]]
4034+ ;
4035+ %xx = or disjoint i8 %x , 18
4036+ %se = zext i8 %xx to i32
4037+ %r = add i32 %se , -14
4038+ ret i32 %r
4039+ }
4040+
4041+ define i32 @fold_zext_addition_fail (i8 %x ) {
4042+ ; CHECK-LABEL: @fold_zext_addition_fail(
4043+ ; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 12
4044+ ; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4045+ ; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[SE]], 1234
4046+ ; CHECK-NEXT: ret i32 [[R]]
4047+ ;
4048+ %xx = or i8 %x , 12
4049+ %se = zext i8 %xx to i32
4050+ %r = add i32 %se , 1234
4051+ ret i32 %r
4052+ }
4053+
4054+ define i32 @fold_zext_addition_fail2 (i8 %x ) {
4055+ ; CHECK-LABEL: @fold_zext_addition_fail2(
4056+ ; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 18
4057+ ; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4058+ ; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], -14
4059+ ; CHECK-NEXT: ret i32 [[R]]
4060+ ;
4061+ %xx = or i8 %x , 18
4062+ %se = zext i8 %xx to i32
4063+ %r = add i32 %se , -14
4064+ ret i32 %r
4065+ }
4066+
4067+
39894068declare void @llvm.assume (i1 )
39904069declare void @fake_func (i32 )
0 commit comments