diff --git a/llvm/test/Transforms/InstCombine/shift-add.ll b/llvm/test/Transforms/InstCombine/shift-add.ll --- a/llvm/test/Transforms/InstCombine/shift-add.ll +++ b/llvm/test/Transforms/InstCombine/shift-add.ll @@ -499,8 +499,34 @@ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[ADD]], 16 ; CHECK-NEXT: ret i32 [[LSHR]] ; - %a16 = and i32 %a, 65535 ; 0x65535 - %b16 = and i32 %b, 65535 ; 0x65535 + %a16 = and i32 %a, 65535 ; 0xFFFF + %b16 = and i32 %b, 65535 ; 0xFFFF + %add = add i32 %a16, %b16 + %lshr = lshr i32 %add, 16 + ret i32 %lshr +} + +define i32 @lshr_16_add_known_17_leading_zeroes(i32 %a, i32 %b) { +; CHECK-LABEL: @lshr_16_add_known_17_leading_zeroes( +; CHECK-NEXT: ret i32 0 +; + %a16 = and i32 %a, 4095 ; 0xFFF + %b16 = and i32 %b, 4095 ; 0xFFF + %add = add i32 %a16, %b16 + %lshr = lshr i32 %add, 16 + ret i32 %lshr +} + +define i32 @lshr_16_add_known_16_17_leading_zeroes(i32 %a, i32 %b) { +; CHECK-LABEL: @lshr_16_add_known_16_17_leading_zeroes( +; CHECK-NEXT: [[A16:%.*]] = and i32 [[A:%.*]], 4095 +; CHECK-NEXT: [[B16:%.*]] = and i32 [[B:%.*]], 65535 +; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[A16]], [[B16]] +; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[ADD]], 16 +; CHECK-NEXT: ret i32 [[LSHR]] +; + %a16 = and i32 %a, 4095 ; 0xFFF + %b16 = and i32 %b, 65535 ; 0xFFFF %add = add i32 %a16, %b16 %lshr = lshr i32 %add, 16 ret i32 %lshr @@ -607,6 +633,32 @@ ret i64 %lshr } +define i64 @lshr_32_add_known_33_leading_zeroes(i64 %a, i64 %b) { +; CHECK-LABEL: @lshr_32_add_known_33_leading_zeroes( +; CHECK-NEXT: ret i64 0 +; + %a32 = and i64 %a, 268435455 ; 0xFFFFFFF + %b32 = and i64 %b, 268435455 ; 0xFFFFFFF + %add = add i64 %a32, %b32 + %lshr = lshr i64 %add, 32 + ret i64 %lshr +} + +define i64 @lshr_32_add_known_32_33_leading_zeroes(i64 %a, i64 %b) { +; CHECK-LABEL: @lshr_32_add_known_32_33_leading_zeroes( +; CHECK-NEXT: [[A32:%.*]] = and i64 [[A:%.*]], 268435455 +; CHECK-NEXT: [[B32:%.*]] = and i64 [[B:%.*]], 4294967295 +; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[A32]], [[B32]] +; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[ADD]], 32 +; CHECK-NEXT: ret i64 [[LSHR]] +; + %a32 = and i64 %a, 268435455 ; 0xFFFFFFFF + %b32 = and i64 %b, 4294967295 ; 0xFFFFFFF + %add = add i64 %a32, %b32 + %lshr = lshr i64 %add, 32 + ret i64 %lshr +} + define i64 @lshr_32_add_not_known_32_leading_zeroes(i64 %a, i64 %b) { ; ; CHECK-LABEL: @lshr_32_add_not_known_32_leading_zeroes(