119 changes: 119 additions & 0 deletions llvm/test/Transforms/InstCombine/shift-flags.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -passes=instcombine -S | FileCheck %s

define i8 @shl_add_nuw(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @shl_add_nuw(
; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], 63
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2
; CHECK-NEXT: [[R:%.*]] = shl nuw i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = and i8 %amt_in, 63
%cnt = and i8 %cnt_in, 2
%r = shl i8 %amt, %cnt
ret i8 %r
}

define i8 @shl_add_nuw_fail(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @shl_add_nuw_fail(
; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], 63
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 3
; CHECK-NEXT: [[R:%.*]] = shl i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = and i8 %amt_in, 63
%cnt = and i8 %cnt_in, 3
%r = shl i8 %amt, %cnt
ret i8 %r
}

define i8 @shl_add_nuw_and_nsw(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @shl_add_nuw_and_nsw(
; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], 31
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2
; CHECK-NEXT: [[R:%.*]] = shl nuw nsw i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = and i8 %amt_in, 31
%cnt = and i8 %cnt_in, 2
%r = shl i8 %amt, %cnt
ret i8 %r
}

define i8 @shl_add_nsw(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @shl_add_nsw(
; CHECK-NEXT: [[AMT:%.*]] = or i8 [[AMT_IN:%.*]], -32
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2
; CHECK-NEXT: [[R:%.*]] = shl nsw i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = or i8 %amt_in, 224
%cnt = and i8 %cnt_in, 2
%r = shl i8 %amt, %cnt
ret i8 %r
}

define i8 @shl_add_nsw_fail(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @shl_add_nsw_fail(
; CHECK-NEXT: [[AMT:%.*]] = or i8 [[AMT_IN:%.*]], -64
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2
; CHECK-NEXT: [[R:%.*]] = shl i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = or i8 %amt_in, 192
%cnt = and i8 %cnt_in, 2
%r = shl i8 %amt, %cnt
ret i8 %r
}

define i8 @lshr_add_exact(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @lshr_add_exact(
; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -4
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2
; CHECK-NEXT: [[R:%.*]] = lshr exact i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = and i8 %amt_in, -4
%cnt = and i8 %cnt_in, 2
%r = lshr i8 %amt, %cnt
ret i8 %r
}

define i8 @lshr_add_exact_fail(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @lshr_add_exact_fail(
; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -7
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2
; CHECK-NEXT: [[R:%.*]] = lshr i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = and i8 %amt_in, -7
%cnt = and i8 %cnt_in, 2
%r = lshr i8 %amt, %cnt
ret i8 %r
}

define i8 @ashr_add_exact(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @ashr_add_exact(
; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -14
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 1
; CHECK-NEXT: [[R:%.*]] = ashr exact i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = and i8 %amt_in, -14
%cnt = and i8 %cnt_in, 1
%r = ashr i8 %amt, %cnt
ret i8 %r
}

define i8 @ashr_add_exact_fail(i8 %amt_in, i8 %cnt_in) {
; CHECK-LABEL: @ashr_add_exact_fail(
; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -14
; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2
; CHECK-NEXT: [[R:%.*]] = ashr i8 [[AMT]], [[CNT]]
; CHECK-NEXT: ret i8 [[R]]
;
%amt = and i8 %amt_in, -14
%cnt = and i8 %cnt_in, 2
%r = ashr i8 %amt, %cnt
ret i8 %r
}
6 changes: 3 additions & 3 deletions llvm/test/Transforms/InstCombine/trunc-inseltpoison.ll
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ define i64 @test11(i32 %A, i32 %B) {
; CHECK-NEXT: [[C:%.*]] = zext i32 [[A:%.*]] to i64
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[B:%.*]], 31
; CHECK-NEXT: [[E:%.*]] = zext i32 [[TMP1]] to i64
; CHECK-NEXT: [[F:%.*]] = shl i64 [[C]], [[E]]
; CHECK-NEXT: [[F:%.*]] = shl nuw nsw i64 [[C]], [[E]]
; CHECK-NEXT: ret i64 [[F]]
;
%C = zext i32 %A to i128
Expand All @@ -361,7 +361,7 @@ define <2 x i64> @test11_vec(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = zext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[B:%.*]], <i32 31, i32 31>
; CHECK-NEXT: [[E:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
; CHECK-NEXT: [[F:%.*]] = shl <2 x i64> [[C]], [[E]]
; CHECK-NEXT: [[F:%.*]] = shl nuw nsw <2 x i64> [[C]], [[E]]
; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = zext <2 x i32> %A to <2 x i128>
Expand All @@ -377,7 +377,7 @@ define <2 x i64> @test11_vec_nonuniform(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = zext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[B:%.*]], <i32 31, i32 15>
; CHECK-NEXT: [[E:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
; CHECK-NEXT: [[F:%.*]] = shl <2 x i64> [[C]], [[E]]
; CHECK-NEXT: [[F:%.*]] = shl nuw nsw <2 x i64> [[C]], [[E]]
; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = zext <2 x i32> %A to <2 x i128>
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Transforms/InstCombine/trunc.ll
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ define i64 @test11(i32 %A, i32 %B) {
; CHECK-NEXT: [[C:%.*]] = zext i32 [[A:%.*]] to i64
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[B:%.*]], 31
; CHECK-NEXT: [[E:%.*]] = zext i32 [[TMP1]] to i64
; CHECK-NEXT: [[F:%.*]] = shl i64 [[C]], [[E]]
; CHECK-NEXT: [[F:%.*]] = shl nuw nsw i64 [[C]], [[E]]
; CHECK-NEXT: ret i64 [[F]]
;
%C = zext i32 %A to i128
Expand All @@ -361,7 +361,7 @@ define <2 x i64> @test11_vec(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = zext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[B:%.*]], <i32 31, i32 31>
; CHECK-NEXT: [[E:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
; CHECK-NEXT: [[F:%.*]] = shl <2 x i64> [[C]], [[E]]
; CHECK-NEXT: [[F:%.*]] = shl nuw nsw <2 x i64> [[C]], [[E]]
; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = zext <2 x i32> %A to <2 x i128>
Expand All @@ -377,7 +377,7 @@ define <2 x i64> @test11_vec_nonuniform(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = zext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[B:%.*]], <i32 31, i32 15>
; CHECK-NEXT: [[E:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
; CHECK-NEXT: [[F:%.*]] = shl <2 x i64> [[C]], [[E]]
; CHECK-NEXT: [[F:%.*]] = shl nuw nsw <2 x i64> [[C]], [[E]]
; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = zext <2 x i32> %A to <2 x i128>
Expand Down
5 changes: 1 addition & 4 deletions llvm/test/Transforms/InstSimplify/ctpop-pow2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,7 @@ define i16 @ctpop_x_and_negx(i16 %x) {

define i8 @ctpop_x_nz_and_negx(i8 %x) {
; CHECK-LABEL: @ctpop_x_nz_and_negx(
; CHECK-NEXT: [[X1:%.*]] = or i8 [[X:%.*]], 1
; CHECK-NEXT: [[V0:%.*]] = sub i8 0, [[X1]]
; CHECK-NEXT: [[V1:%.*]] = and i8 [[X1]], [[V0]]
; CHECK-NEXT: ret i8 [[V1]]
; CHECK-NEXT: ret i8 1
;
%x1 = or i8 %x, 1
%v0 = sub i8 0, %x1
Expand Down