174 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4declare i16 @llvm.sshl.sat.i16(i16, i16)5declare <4 x i16> @llvm.sshl.sat.v4i16(<4 x i16>, <4 x i16>)6 7; fold (shlsat undef, x) -> 08define i16 @combine_shl_undef(i16 %x, i16 %y) nounwind {9; CHECK-LABEL: combine_shl_undef:10; CHECK: // %bb.0:11; CHECK-NEXT: mov w0, wzr12; CHECK-NEXT: ret13 %tmp = call i16 @llvm.sshl.sat.i16(i16 undef, i16 %y)14 ret i16 %tmp15}16 17; fold (shlsat x, undef) -> undef18define i16 @combine_shl_by_undef(i16 %x, i16 %y) nounwind {19; CHECK-LABEL: combine_shl_by_undef:20; CHECK: // %bb.0:21; CHECK-NEXT: ret22 %tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 undef)23 ret i16 %tmp24}25 26; fold (shlsat poison, x) -> 027define i16 @combine_shl_poison(i16 %x, i16 %y) nounwind {28; CHECK-LABEL: combine_shl_poison:29; CHECK: // %bb.0:30; CHECK-NEXT: mov w0, wzr31; CHECK-NEXT: ret32 %tmp = call i16 @llvm.sshl.sat.i16(i16 poison, i16 %y)33 ret i16 %tmp34}35 36; fold (shlsat x, poison) -> undef37define i16 @combine_shl_by_poison(i16 %x, i16 %y) nounwind {38; CHECK-LABEL: combine_shl_by_poison:39; CHECK: // %bb.0:40; CHECK-NEXT: ret41 %tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 poison)42 ret i16 %tmp43}44 45; fold (shlsat x, bitwidth) -> undef46define i16 @combine_shl_by_bitwidth(i16 %x, i16 %y) nounwind {47; CHECK-LABEL: combine_shl_by_bitwidth:48; CHECK: // %bb.0:49; CHECK-NEXT: ret50 %tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 16)51 ret i16 %tmp52}53 54; fold (shlsat 0, x) -> 055define i16 @combine_shl_zero(i16 %x, i16 %y) nounwind {56; CHECK-LABEL: combine_shl_zero:57; CHECK: // %bb.0:58; CHECK-NEXT: mov w0, wzr59; CHECK-NEXT: ret60 %tmp = call i16 @llvm.sshl.sat.i16(i16 0, i16 %y)61 ret i16 %tmp62}63 64; fold (shlsat x, 0) -> x65define i16 @combine_shlsat_by_zero(i16 %x, i16 %y) nounwind {66; CHECK-LABEL: combine_shlsat_by_zero:67; CHECK: // %bb.0:68; CHECK-NEXT: ret69 %tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 0)70 ret i16 %tmp71}72 73; fold (shlsat c1, c2) -> c374define i16 @combine_shlsat_constfold(i16 %x, i16 %y) nounwind {75; CHECK-LABEL: combine_shlsat_constfold:76; CHECK: // %bb.0:77; CHECK-NEXT: mov w0, #32 // =0x2078; CHECK-NEXT: ret79 %tmp = call i16 @llvm.sshl.sat.i16(i16 8, i16 2)80 ret i16 %tmp81}82 83; fold (shlsat c1, c2) -> sat max84define i16 @combine_shlsat_satmax(i16 %x, i16 %y) nounwind {85; CHECK-LABEL: combine_shlsat_satmax:86; CHECK: // %bb.0:87; CHECK-NEXT: mov w0, #32767 // =0x7fff88; CHECK-NEXT: ret89 %tmp = call i16 @llvm.sshl.sat.i16(i16 8, i16 15)90 ret i16 %tmp91}92 93; fold (shlsat c1, c2) -> sat min94define i16 @combine_shlsat_satmin(i16 %x, i16 %y) nounwind {95; CHECK-LABEL: combine_shlsat_satmin:96; CHECK: // %bb.0:97; CHECK-NEXT: mov w0, #32768 // =0x800098; CHECK-NEXT: ret99 %tmp = call i16 @llvm.sshl.sat.i16(i16 -8, i16 15)100 ret i16 %tmp101}102 103declare void @sink4xi16(i16, i16, i16, i16)104 105; fold (shlsat c1, c2) -> c3 , c1/c2/c3 being vectors106define void @combine_shlsat_vector() nounwind {107; CHECK-LABEL: combine_shlsat_vector:108; CHECK: // %bb.0:109; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill110; CHECK-NEXT: mov w0, #32 // =0x20111; CHECK-NEXT: mov w1, #32767 // =0x7fff112; CHECK-NEXT: mov w2, #65504 // =0xffe0113; CHECK-NEXT: mov w3, #32768 // =0x8000114; CHECK-NEXT: bl sink4xi16115; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload116; CHECK-NEXT: ret117 %tmp = call <4 x i16> @llvm.sshl.sat.v4i16(118 <4 x i16><i16 8, i16 8, i16 -8, i16 -8>,119 <4 x i16><i16 2, i16 15, i16 2, i16 15>)120 ; Pass elements as arguments in a call to get CHECK statements that verify121 ; the constant folding.122 %e0 = extractelement <4 x i16> %tmp, i16 0123 %e1 = extractelement <4 x i16> %tmp, i16 1124 %e2 = extractelement <4 x i16> %tmp, i16 2125 %e3 = extractelement <4 x i16> %tmp, i16 3126 call void @sink4xi16(i16 %e0, i16 %e1, i16 %e2, i16 %e3)127 ret void128}129 130; Fold shlsat -> shl, if known not to saturate.131define i16 @combine_shlsat_to_shl(i16 %x) nounwind {132; CHECK-LABEL: combine_shlsat_to_shl:133; CHECK: // %bb.0:134; CHECK-NEXT: and w0, w0, #0xfffffffc135; CHECK-NEXT: ret136 %x2 = ashr i16 %x, 2137 %tmp = call i16 @llvm.sshl.sat.i16(i16 %x2, i16 2)138 ret i16 %tmp139}140 141; Do not fold shlsat -> shl.142define i16 @combine_shlsat_to_shl_no_fold(i16 %x) nounwind {143; CHECK-LABEL: combine_shlsat_to_shl_no_fold:144; CHECK: // %bb.0:145; CHECK-NEXT: sxth w8, w0146; CHECK-NEXT: mov w9, #-65536 // =0xffff0000147; CHECK-NEXT: mov w10, #-2147483648 // =0x80000000148; CHECK-NEXT: ands w8, w9, w8, lsl #14149; CHECK-NEXT: cinv w10, w10, pl150; CHECK-NEXT: lsl w9, w8, #3151; CHECK-NEXT: cmp w8, w9, asr #3152; CHECK-NEXT: csel w8, w10, w9, ne153; CHECK-NEXT: asr w0, w8, #16154; CHECK-NEXT: ret155 %x2 = ashr i16 %x, 2156 %tmp = call i16 @llvm.sshl.sat.i16(i16 %x2, i16 3)157 ret i16 %tmp158}159 160; Fold shlsat -> shl, if known not to saturate.161define <4 x i16> @combine_shlsat_to_shl_vec(<4 x i8> %a) nounwind {162; CHECK-LABEL: combine_shlsat_to_shl_vec:163; CHECK: // %bb.0:164; CHECK-NEXT: shl v0.4h, v0.4h, #8165; CHECK-NEXT: sshr v0.4h, v0.4h, #8166; CHECK-NEXT: shl v0.4h, v0.4h, #7167; CHECK-NEXT: ret168 %sext = sext <4 x i8> %a to <4 x i16>169 %tmp = call <4 x i16> @llvm.sshl.sat.v4i16(170 <4 x i16> %sext,171 <4 x i16> <i16 7, i16 7, i16 7, i16 7>)172 ret <4 x i16> %tmp173}174