161 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -avr-shift-expand -S %s -o - | FileCheck %s3 4; The avr-shift-expand pass expands large shifts with a non-constant shift5; amount to a loop. These loops avoid generating a (non-existing) builtin such6; as __ashlsi3.7 8target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"9target triple = "avr"10 11define i16 @shl16(i16 %value, i16 %amount) addrspace(1) {12; CHECK-LABEL: @shl16(13; CHECK-NEXT: [[RESULT:%.*]] = shl i16 [[VALUE:%.*]], [[AMOUNT:%.*]]14; CHECK-NEXT: ret i16 [[RESULT]]15;16 %result = shl i16 %value, %amount17 ret i16 %result18}19 20define i32 @shl32(i32 %value, i32 %amount) addrspace(1) {21; CHECK-LABEL: @shl32(22; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i823; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 024; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]25; CHECK: shift.loop:26; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]27; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]28; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 129; CHECK-NEXT: [[TMP6]] = shl i32 [[TMP4]], 130; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 031; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]32; CHECK: shift.done:33; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]34; CHECK-NEXT: ret i32 [[TMP8]]35;36 %result = shl i32 %value, %amount37 ret i32 %result38}39 40define i40 @shl40(i40 %value, i40 %amount) addrspace(1) {41; CHECK-LABEL: @shl40(42; CHECK-NEXT: [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i843; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 044; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]45; CHECK: shift.loop:46; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]47; CHECK-NEXT: [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]48; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 149; CHECK-NEXT: [[TMP6]] = shl i40 [[TMP4]], 150; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 051; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]52; CHECK: shift.done:53; CHECK-NEXT: [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]54; CHECK-NEXT: ret i40 [[TMP8]]55;56 %result = shl i40 %value, %amount57 ret i40 %result58}59 60; ------------------------------------------------------------------------------61 62define i16 @lshr16(i16 %value, i16 %amount) addrspace(1) {63; CHECK-LABEL: @lshr16(64; CHECK-NEXT: [[RESULT:%.*]] = lshr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]65; CHECK-NEXT: ret i16 [[RESULT]]66;67 %result = lshr i16 %value, %amount68 ret i16 %result69}70 71define i32 @lshr32(i32 %value, i32 %amount) addrspace(1) {72; CHECK-LABEL: @lshr32(73; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i874; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 075; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]76; CHECK: shift.loop:77; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]78; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]79; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 180; CHECK-NEXT: [[TMP6]] = lshr i32 [[TMP4]], 181; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 082; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]83; CHECK: shift.done:84; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]85; CHECK-NEXT: ret i32 [[TMP8]]86;87 %result = lshr i32 %value, %amount88 ret i32 %result89}90 91define i40 @lshr40(i40 %value, i40 %amount) addrspace(1) {92; CHECK-LABEL: @lshr40(93; CHECK-NEXT: [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i894; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 095; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]96; CHECK: shift.loop:97; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]98; CHECK-NEXT: [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]99; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 1100; CHECK-NEXT: [[TMP6]] = lshr i40 [[TMP4]], 1101; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0102; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]103; CHECK: shift.done:104; CHECK-NEXT: [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]105; CHECK-NEXT: ret i40 [[TMP8]]106;107 %result = lshr i40 %value, %amount108 ret i40 %result109}110 111; ------------------------------------------------------------------------------112 113define i16 @ashr16(i16 %value, i16 %amount) addrspace(1) {114; CHECK-LABEL: @ashr16(115; CHECK-NEXT: [[RESULT:%.*]] = ashr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]116; CHECK-NEXT: ret i16 [[RESULT]]117;118 %result = ashr i16 %value, %amount119 ret i16 %result120}121 122define i32 @ashr32(i32 %value, i32 %amount) addrspace(1) {123; CHECK-LABEL: @ashr32(124; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8125; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0126; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]127; CHECK: shift.loop:128; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]129; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]130; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 1131; CHECK-NEXT: [[TMP6]] = ashr i32 [[TMP4]], 1132; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0133; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]134; CHECK: shift.done:135; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]136; CHECK-NEXT: ret i32 [[TMP8]]137;138 %result = ashr i32 %value, %amount139 ret i32 %result140}141 142define i40 @ashr40(i40 %value, i40 %amount) addrspace(1) {143; CHECK-LABEL: @ashr40(144; CHECK-NEXT: [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i8145; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0146; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]147; CHECK: shift.loop:148; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]149; CHECK-NEXT: [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]150; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 1151; CHECK-NEXT: [[TMP6]] = ashr i40 [[TMP4]], 1152; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0153; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]154; CHECK: shift.done:155; CHECK-NEXT: [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]156; CHECK-NEXT: ret i40 [[TMP8]]157;158 %result = ashr i40 %value, %amount159 ret i40 %result160}161