124 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4; With no-wrap:5; (X * Y) == 0 --> (X == 0) || (Y == 0)6; (X * Y) != 0 --> (X != 0) && (Y != 0)7 8define i1 @mul_nsw_eq0_i8(i8 %x, i8 %y) {9; CHECK-LABEL: mul_nsw_eq0_i8:10; CHECK: // %bb.0:11; CHECK-NEXT: tst w0, #0xff12; CHECK-NEXT: cset w8, eq13; CHECK-NEXT: tst w1, #0xff14; CHECK-NEXT: csinc w0, w8, wzr, ne15; CHECK-NEXT: ret16 %m = mul nsw i8 %x, %y17 %r = icmp eq i8 %m, 018 ret i1 %r19}20 21; negative test - not valid if mul can overflow22 23define i1 @mul_eq0_i8(i8 %x, i8 %y) {24; CHECK-LABEL: mul_eq0_i8:25; CHECK: // %bb.0:26; CHECK-NEXT: mul w8, w0, w127; CHECK-NEXT: tst w8, #0xff28; CHECK-NEXT: cset w0, eq29; CHECK-NEXT: ret30 %m = mul i8 %x, %y31 %r = icmp eq i8 %m, 032 ret i1 %r33}34 35; negative test - don't try with minsize36 37define i1 @mul_nsw_eq0_i8_size(i8 %x, i8 %y) minsize {38; CHECK-LABEL: mul_nsw_eq0_i8_size:39; CHECK: // %bb.0:40; CHECK-NEXT: mul w8, w0, w141; CHECK-NEXT: tst w8, #0xff42; CHECK-NEXT: cset w0, eq43; CHECK-NEXT: ret44 %m = mul nsw i8 %x, %y45 %r = icmp eq i8 %m, 046 ret i1 %r47}48 49define i1 @mul_nsw_ne0_i16(i16 %x, i16 %y) {50; CHECK-LABEL: mul_nsw_ne0_i16:51; CHECK: // %bb.0:52; CHECK-NEXT: tst w0, #0xffff53; CHECK-NEXT: cset w8, ne54; CHECK-NEXT: tst w1, #0xffff55; CHECK-NEXT: csel w0, wzr, w8, eq56; CHECK-NEXT: ret57 %m = mul nsw i16 %x, %y58 %r = icmp ne i16 %m, 059 ret i1 %r60}61 62define i1 @mul_nuw_eq0_i32(i32 %x, i32 %y) {63; CHECK-LABEL: mul_nuw_eq0_i32:64; CHECK: // %bb.0:65; CHECK-NEXT: cmp w0, #066; CHECK-NEXT: ccmp w1, #0, #4, ne67; CHECK-NEXT: cset w0, eq68; CHECK-NEXT: ret69 %m = mul nuw i32 %x, %y70 %r = icmp eq i32 %m, 071 ret i1 %r72}73 74define i1 @mul_nsw_nuw_ne0_i64(i64 %x, i64 %y) {75; CHECK-LABEL: mul_nsw_nuw_ne0_i64:76; CHECK: // %bb.0:77; CHECK-NEXT: cmp x0, #078; CHECK-NEXT: ccmp x1, #0, #4, ne79; CHECK-NEXT: cset w0, ne80; CHECK-NEXT: ret81 %m = mul nsw nuw i64 %x, %y82 %r = icmp ne i64 %m, 083 ret i1 %r84}85 86define <16 x i1> @mul_nuw_eq0_v16i8(<16 x i8> %x, <16 x i8> %y) {87; CHECK-LABEL: mul_nuw_eq0_v16i8:88; CHECK: // %bb.0:89; CHECK-NEXT: cmeq v1.16b, v1.16b, #090; CHECK-NEXT: cmeq v0.16b, v0.16b, #091; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b92; CHECK-NEXT: ret93 %m = mul nuw <16 x i8> %x, %y94 %r = icmp eq <16 x i8> %m, zeroinitializer95 ret <16 x i1> %r96}97 98define <4 x i1> @mul_nsw_ne0_v4i32(<4 x i32> %x, <4 x i32> %y) {99; CHECK-LABEL: mul_nsw_ne0_v4i32:100; CHECK: // %bb.0:101; CHECK-NEXT: cmtst v0.4s, v0.4s, v0.4s102; CHECK-NEXT: cmeq v1.4s, v1.4s, #0103; CHECK-NEXT: bic v0.16b, v0.16b, v1.16b104; CHECK-NEXT: xtn v0.4h, v0.4s105; CHECK-NEXT: ret106 %m = mul nsw <4 x i32> %x, %y107 %r = icmp ne <4 x i32> %m, zeroinitializer108 ret <4 x i1> %r109}110 111; negative test - don't try with minsize112 113define <4 x i1> @mul_nsw_ne0_v4i32_size(<4 x i32> %x, <4 x i32> %y) minsize {114; CHECK-LABEL: mul_nsw_ne0_v4i32_size:115; CHECK: // %bb.0:116; CHECK-NEXT: mul v0.4s, v0.4s, v1.4s117; CHECK-NEXT: cmtst v0.4s, v0.4s, v0.4s118; CHECK-NEXT: xtn v0.4h, v0.4s119; CHECK-NEXT: ret120 %m = mul nsw <4 x i32> %x, %y121 %r = icmp ne <4 x i32> %m, zeroinitializer122 ret <4 x i1> %r123}124