1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -S -passes=instsimplify | FileCheck %s 3 4declare i16 @llvm.smul.fix.i16(i16, i16, i32) 5declare i16 @llvm.smul.fix.sat.i16(i16, i16, i32) 6declare <2 x i16> @llvm.smul.fix.v2i16(<2 x i16>, <2 x i16>, i32) 7declare <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16>, <2 x i16>, i32) 8 9;; 10;; llvm.smul.fix (scalar) 11;; 12 13; X * 0 -> X 14define i16 @smul_fix_0(i16 %arg) { 15; CHECK-LABEL: @smul_fix_0( 16; CHECK-NEXT: ret i16 0 17; 18 %res = call i16 @llvm.smul.fix.i16(i16 %arg, i16 0, i32 15) 19 ret i16 %res 20} 21 22; 0 * X -> X 23define i16 @smul_fix_1(i16 %arg) { 24; CHECK-LABEL: @smul_fix_1( 25; CHECK-NEXT: ret i16 0 26; 27 %res = call i16 @llvm.smul.fix.i16(i16 0, i16 %arg, i32 15) 28 ret i16 %res 29} 30 31; X * undef -> undef 32define i16 @smul_fix_2(i16 %arg) { 33; CHECK-LABEL: @smul_fix_2( 34; CHECK-NEXT: ret i16 0 35; 36 %res = call i16 @llvm.smul.fix.i16(i16 %arg, i16 undef, i32 15) 37 ret i16 %res 38} 39 40; undef * X -> undef 41define i16 @smul_fix_3(i16 %arg) { 42; CHECK-LABEL: @smul_fix_3( 43; CHECK-NEXT: ret i16 0 44; 45 %res = call i16 @llvm.smul.fix.i16(i16 undef, i16 %arg, i32 15) 46 ret i16 %res 47} 48 49; X * 1 -> X 50define i16 @smul_fix_4(i16 %arg) { 51; CHECK-LABEL: @smul_fix_4( 52; CHECK-NEXT: ret i16 [[ARG:%.*]] 53; 54 %res = call i16 @llvm.smul.fix.i16(i16 %arg, i16 16384, i32 14) 55 ret i16 %res 56} 57 58; 1 * X -> X 59define i16 @smul_fix_5(i16 %arg) { 60; CHECK-LABEL: @smul_fix_5( 61; CHECK-NEXT: ret i16 [[ARG:%.*]] 62; 63 %res = call i16 @llvm.smul.fix.i16(i16 2, i16 %arg, i32 1) 64 ret i16 %res 65} 66 67;; 68;; llvm.smul.fix.sat (scalar) 69;; 70 71; X * 0 -> X 72define i16 @smul_fix_sat_0(i16 %arg) { 73; CHECK-LABEL: @smul_fix_sat_0( 74; CHECK-NEXT: ret i16 0 75; 76 %res = call i16 @llvm.smul.fix.sat.i16(i16 %arg, i16 0, i32 15) 77 ret i16 %res 78} 79 80; 0 * X -> X 81define i16 @smul_fix_sat_1(i16 %arg) { 82; CHECK-LABEL: @smul_fix_sat_1( 83; CHECK-NEXT: ret i16 0 84; 85 %res = call i16 @llvm.smul.fix.sat.i16(i16 0, i16 %arg, i32 15) 86 ret i16 %res 87} 88 89; X * undef -> undef 90define i16 @smul_fix_sat_2(i16 %arg) { 91; CHECK-LABEL: @smul_fix_sat_2( 92; CHECK-NEXT: ret i16 0 93; 94 %res = call i16 @llvm.smul.fix.sat.i16(i16 %arg, i16 undef, i32 15) 95 ret i16 %res 96} 97 98; undef * X -> undef 99define i16 @smul_fix_sat_3(i16 %arg) { 100; CHECK-LABEL: @smul_fix_sat_3( 101; CHECK-NEXT: ret i16 0 102; 103 %res = call i16 @llvm.smul.fix.sat.i16(i16 undef, i16 %arg, i32 15) 104 ret i16 %res 105} 106 107; X * 1 -> X 108define i16 @smul_fix_sat_4(i16 %arg) { 109; CHECK-LABEL: @smul_fix_sat_4( 110; CHECK-NEXT: ret i16 [[ARG:%.*]] 111; 112 %res = call i16 @llvm.smul.fix.sat.i16(i16 %arg, i16 16384, i32 14) 113 ret i16 %res 114} 115 116; 1 * X -> X 117define i16 @smul_fix_sat_5(i16 %arg) { 118; CHECK-LABEL: @smul_fix_sat_5( 119; CHECK-NEXT: ret i16 [[ARG:%.*]] 120; 121 %res = call i16 @llvm.smul.fix.sat.i16(i16 2, i16 %arg, i32 1) 122 ret i16 %res 123} 124 125;; 126;; llvm.smul.fix (vector) 127;; 128 129; X * 0 -> X 130define <2 x i16> @smul_fix_vec_0(<2 x i16> %arg) { 131; CHECK-LABEL: @smul_fix_vec_0( 132; CHECK-NEXT: ret <2 x i16> zeroinitializer 133; 134 %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> %arg, <2 x i16> zeroinitializer, i32 15) 135 ret <2 x i16> %res 136} 137 138; 0 * X -> X 139define <2 x i16> @smul_fix_vec_1(<2 x i16> %arg) { 140; CHECK-LABEL: @smul_fix_vec_1( 141; CHECK-NEXT: ret <2 x i16> zeroinitializer 142; 143 %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> zeroinitializer, <2 x i16> %arg, i32 15) 144 ret <2 x i16> %res 145} 146 147; X * undef -> undef 148define <2 x i16> @smul_fix_vec_2(<2 x i16> %arg) { 149; CHECK-LABEL: @smul_fix_vec_2( 150; CHECK-NEXT: ret <2 x i16> zeroinitializer 151; 152 %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> %arg, <2 x i16> undef, i32 15) 153 ret <2 x i16> %res 154} 155 156; undef * X -> undef 157define <2 x i16> @smul_fix_vec_3(<2 x i16> %arg) { 158; CHECK-LABEL: @smul_fix_vec_3( 159; CHECK-NEXT: ret <2 x i16> zeroinitializer 160; 161 %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> undef, <2 x i16> %arg, i32 15) 162 ret <2 x i16> %res 163} 164 165; X * 1 -> X 166define <2 x i16> @smul_fix_vec_4(<2 x i16> %arg) { 167; CHECK-LABEL: @smul_fix_vec_4( 168; CHECK-NEXT: ret <2 x i16> [[ARG:%.*]] 169; 170 %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> %arg, <2 x i16> <i16 16384, i16 16384>, i32 14) 171 ret <2 x i16> %res 172} 173 174; 1 * X -> X 175define <2 x i16> @smul_fix_vec_5(<2 x i16> %arg) { 176; CHECK-LABEL: @smul_fix_vec_5( 177; CHECK-NEXT: ret <2 x i16> [[ARG:%.*]] 178; 179 %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> <i16 2, i16 2>, <2 x i16> %arg, i32 1) 180 ret <2 x i16> %res 181} 182 183;; 184;; llvm.smul.fix.sat (vector) 185;; 186 187; X * 0 -> X 188define <2 x i16> @smul_fix_sat_vec_0(<2 x i16> %arg) { 189; CHECK-LABEL: @smul_fix_sat_vec_0( 190; CHECK-NEXT: ret <2 x i16> zeroinitializer 191; 192 %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> %arg, <2 x i16> zeroinitializer, i32 15) 193 ret <2 x i16> %res 194} 195 196; 0 * X -> X 197define <2 x i16> @smul_fix_sat_vec_1(<2 x i16> %arg) { 198; CHECK-LABEL: @smul_fix_sat_vec_1( 199; CHECK-NEXT: ret <2 x i16> zeroinitializer 200; 201 %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> zeroinitializer, <2 x i16> %arg, i32 15) 202 ret <2 x i16> %res 203} 204 205; X * undef -> undef 206define <2 x i16> @smul_fix_sat_vec_2(<2 x i16> %arg) { 207; CHECK-LABEL: @smul_fix_sat_vec_2( 208; CHECK-NEXT: ret <2 x i16> zeroinitializer 209; 210 %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> %arg, <2 x i16> undef, i32 15) 211 ret <2 x i16> %res 212} 213 214; undef * X -> undef 215define <2 x i16> @smul_fix_sat_vec_3(<2 x i16> %arg) { 216; CHECK-LABEL: @smul_fix_sat_vec_3( 217; CHECK-NEXT: ret <2 x i16> zeroinitializer 218; 219 %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> undef, <2 x i16> %arg, i32 15) 220 ret <2 x i16> %res 221} 222 223; X * 1 -> X 224define <2 x i16> @smul_fix_sat_vec_4(<2 x i16> %arg) { 225; CHECK-LABEL: @smul_fix_sat_vec_4( 226; CHECK-NEXT: ret <2 x i16> [[ARG:%.*]] 227; 228 %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> %arg, <2 x i16> <i16 16384, i16 16384>, i32 14) 229 ret <2 x i16> %res 230} 231 232; 1 * X -> X 233define <2 x i16> @smul_fix_sat_vec_5(<2 x i16> %arg) { 234; CHECK-LABEL: @smul_fix_sat_vec_5( 235; CHECK-NEXT: ret <2 x i16> [[ARG:%.*]] 236; 237 %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> <i16 2, i16 2>, <2 x i16> %arg, i32 1) 238 ret <2 x i16> %res 239} 240