1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define i8 @shl_add_nuw(i8 %amt_in, i8 %cnt_in) { 5; CHECK-LABEL: @shl_add_nuw( 6; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], 63 7; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2 8; CHECK-NEXT: [[R:%.*]] = shl nuw i8 [[AMT]], [[CNT]] 9; CHECK-NEXT: ret i8 [[R]] 10; 11 %amt = and i8 %amt_in, 63 12 %cnt = and i8 %cnt_in, 2 13 %r = shl i8 %amt, %cnt 14 ret i8 %r 15} 16 17define i8 @shl_add_nuw_fail(i8 %amt_in, i8 %cnt_in) { 18; CHECK-LABEL: @shl_add_nuw_fail( 19; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], 63 20; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 3 21; CHECK-NEXT: [[R:%.*]] = shl i8 [[AMT]], [[CNT]] 22; CHECK-NEXT: ret i8 [[R]] 23; 24 %amt = and i8 %amt_in, 63 25 %cnt = and i8 %cnt_in, 3 26 %r = shl i8 %amt, %cnt 27 ret i8 %r 28} 29 30define i8 @shl_add_nuw_and_nsw(i8 %amt_in, i8 %cnt_in) { 31; CHECK-LABEL: @shl_add_nuw_and_nsw( 32; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], 31 33; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2 34; CHECK-NEXT: [[R:%.*]] = shl nuw nsw i8 [[AMT]], [[CNT]] 35; CHECK-NEXT: ret i8 [[R]] 36; 37 %amt = and i8 %amt_in, 31 38 %cnt = and i8 %cnt_in, 2 39 %r = shl i8 %amt, %cnt 40 ret i8 %r 41} 42 43define i8 @shl_add_nsw(i8 %amt_in, i8 %cnt_in) { 44; CHECK-LABEL: @shl_add_nsw( 45; CHECK-NEXT: [[AMT:%.*]] = or i8 [[AMT_IN:%.*]], -32 46; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2 47; CHECK-NEXT: [[R:%.*]] = shl nsw i8 [[AMT]], [[CNT]] 48; CHECK-NEXT: ret i8 [[R]] 49; 50 %amt = or i8 %amt_in, 224 51 %cnt = and i8 %cnt_in, 2 52 %r = shl i8 %amt, %cnt 53 ret i8 %r 54} 55 56define i8 @shl_add_nsw_fail(i8 %amt_in, i8 %cnt_in) { 57; CHECK-LABEL: @shl_add_nsw_fail( 58; CHECK-NEXT: [[AMT:%.*]] = or i8 [[AMT_IN:%.*]], -64 59; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2 60; CHECK-NEXT: [[R:%.*]] = shl i8 [[AMT]], [[CNT]] 61; CHECK-NEXT: ret i8 [[R]] 62; 63 %amt = or i8 %amt_in, 192 64 %cnt = and i8 %cnt_in, 2 65 %r = shl i8 %amt, %cnt 66 ret i8 %r 67} 68 69define i8 @lshr_add_exact(i8 %amt_in, i8 %cnt_in) { 70; CHECK-LABEL: @lshr_add_exact( 71; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -4 72; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2 73; CHECK-NEXT: [[R:%.*]] = lshr exact i8 [[AMT]], [[CNT]] 74; CHECK-NEXT: ret i8 [[R]] 75; 76 %amt = and i8 %amt_in, -4 77 %cnt = and i8 %cnt_in, 2 78 %r = lshr i8 %amt, %cnt 79 ret i8 %r 80} 81 82define i8 @lshr_add_exact_fail(i8 %amt_in, i8 %cnt_in) { 83; CHECK-LABEL: @lshr_add_exact_fail( 84; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -7 85; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2 86; CHECK-NEXT: [[R:%.*]] = lshr i8 [[AMT]], [[CNT]] 87; CHECK-NEXT: ret i8 [[R]] 88; 89 %amt = and i8 %amt_in, -7 90 %cnt = and i8 %cnt_in, 2 91 %r = lshr i8 %amt, %cnt 92 ret i8 %r 93} 94 95define i8 @ashr_add_exact(i8 %amt_in, i8 %cnt_in) { 96; CHECK-LABEL: @ashr_add_exact( 97; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -14 98; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 1 99; CHECK-NEXT: [[R:%.*]] = ashr exact i8 [[AMT]], [[CNT]] 100; CHECK-NEXT: ret i8 [[R]] 101; 102 %amt = and i8 %amt_in, -14 103 %cnt = and i8 %cnt_in, 1 104 %r = ashr i8 %amt, %cnt 105 ret i8 %r 106} 107 108define i8 @ashr_add_exact_fail(i8 %amt_in, i8 %cnt_in) { 109; CHECK-LABEL: @ashr_add_exact_fail( 110; CHECK-NEXT: [[AMT:%.*]] = and i8 [[AMT_IN:%.*]], -14 111; CHECK-NEXT: [[CNT:%.*]] = and i8 [[CNT_IN:%.*]], 2 112; CHECK-NEXT: [[R:%.*]] = ashr i8 [[AMT]], [[CNT]] 113; CHECK-NEXT: ret i8 [[R]] 114; 115 %amt = and i8 %amt_in, -14 116 %cnt = and i8 %cnt_in, 2 117 %r = ashr i8 %amt, %cnt 118 ret i8 %r 119} 120