1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instsimplify -S | FileCheck %s --check-prefixes=CHECK,CONSTPROP 3; RUN: opt < %s -instsimplify -S | FileCheck %s --check-prefixes=CHECK,INSTSIMPLIFY 4; We must *NOT* have any check-lines with prefixes other than CHECK here. 5; If we do, that means the rules are different between the passes. 6 7declare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8) 8declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8) 9declare {i8, i1} @llvm.umul.with.overflow.i8(i8, i8) 10 11declare {i8, i1} @llvm.sadd.with.overflow.i8(i8, i8) 12declare {i8, i1} @llvm.ssub.with.overflow.i8(i8, i8) 13declare {i8, i1} @llvm.smul.with.overflow.i8(i8, i8) 14 15;;----------------------------- 16;; uadd 17;;----------------------------- 18 19define {i8, i1} @uadd_1() nounwind { 20; CHECK-LABEL: @uadd_1( 21; CHECK-NEXT: ret { i8, i1 } { i8 -114, i1 false } 22; 23 %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 42, i8 100) 24 ret {i8, i1} %t 25} 26 27define {i8, i1} @uadd_2() nounwind { 28; CHECK-LABEL: @uadd_2( 29; CHECK-NEXT: ret { i8, i1 } { i8 6, i1 true } 30; 31 %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 120) 32 ret {i8, i1} %t 33} 34 35define {i8, i1} @uadd_undef() nounwind { 36; CHECK-LABEL: @uadd_undef( 37; CHECK-NEXT: ret { i8, i1 } { i8 undef, i1 false } 38; 39 %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 undef) 40 ret {i8, i1} %t 41} 42 43;;----------------------------- 44;; usub 45;;----------------------------- 46 47define {i8, i1} @usub_1() nounwind { 48; CHECK-LABEL: @usub_1( 49; CHECK-NEXT: ret { i8, i1 } { i8 2, i1 false } 50; 51 %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 2) 52 ret {i8, i1} %t 53} 54 55define {i8, i1} @usub_2() nounwind { 56; CHECK-LABEL: @usub_2( 57; CHECK-NEXT: ret { i8, i1 } { i8 -2, i1 true } 58; 59 %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 6) 60 ret {i8, i1} %t 61} 62 63define {i8, i1} @usub_undef() nounwind { 64; CHECK-LABEL: @usub_undef( 65; CHECK-NEXT: ret { i8, i1 } { i8 undef, i1 false } 66; 67 %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 undef) 68 ret {i8, i1} %t 69} 70 71;;----------------------------- 72;; umul 73;;----------------------------- 74 75define {i8, i1} @umul_1() nounwind { 76; CHECK-LABEL: @umul_1( 77; CHECK-NEXT: ret { i8, i1 } { i8 44, i1 true } 78; 79 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 3) 80 ret {i8, i1} %t 81} 82 83define {i8, i1} @umul_2() nounwind { 84; CHECK-LABEL: @umul_2( 85; CHECK-NEXT: ret { i8, i1 } { i8 -56, i1 false } 86; 87 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 100, i8 2) 88 ret {i8, i1} %t 89} 90 91define {i8, i1} @umul_undef() nounwind { 92; CHECK-LABEL: @umul_undef( 93; CHECK-NEXT: ret { i8, i1 } zeroinitializer 94; 95 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 undef, i8 2) 96 ret {i8, i1} %t 97} 98 99define {i8, i1} @umul_both_undef() nounwind { 100; CHECK-LABEL: @umul_both_undef( 101; CHECK-NEXT: ret { i8, i1 } zeroinitializer 102; 103 %t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 undef, i8 undef) 104 ret {i8, i1} %t 105} 106 107;;----------------------------- 108;; sadd 109;;----------------------------- 110 111define {i8, i1} @sadd_1() nounwind { 112; CHECK-LABEL: @sadd_1( 113; CHECK-NEXT: ret { i8, i1 } { i8 44, i1 false } 114; 115 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 42, i8 2) 116 ret {i8, i1} %t 117} 118 119define {i8, i1} @sadd_2() nounwind { 120; CHECK-LABEL: @sadd_2( 121; CHECK-NEXT: ret { i8, i1 } { i8 -126, i1 true } 122; 123 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 120, i8 10) 124 ret {i8, i1} %t 125} 126 127define {i8, i1} @sadd_3() nounwind { 128; CHECK-LABEL: @sadd_3( 129; CHECK-NEXT: ret { i8, i1 } { i8 -110, i1 false } 130; 131 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 10) 132 ret {i8, i1} %t 133} 134 135define {i8, i1} @sadd_4() nounwind { 136; CHECK-LABEL: @sadd_4( 137; CHECK-NEXT: ret { i8, i1 } { i8 126, i1 true } 138; 139 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 -10) 140 ret {i8, i1} %t 141} 142 143define {i8, i1} @sadd_5() nounwind { 144; CHECK-LABEL: @sadd_5( 145; CHECK-NEXT: ret { i8, i1 } { i8 -8, i1 false } 146; 147 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 2, i8 -10) 148 ret {i8, i1} %t 149} 150 151define {i8, i1} @sadd_undef() nounwind { 152; CHECK-LABEL: @sadd_undef( 153; CHECK-NEXT: ret { i8, i1 } { i8 undef, i1 false } 154; 155 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 undef, i8 -10) 156 ret {i8, i1} %t 157} 158 159;;----------------------------- 160;; ssub 161;;----------------------------- 162 163define {i8, i1} @ssub_1() nounwind { 164; CHECK-LABEL: @ssub_1( 165; CHECK-NEXT: ret { i8, i1 } { i8 2, i1 false } 166; 167 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 2) 168 ret {i8, i1} %t 169} 170 171define {i8, i1} @ssub_2() nounwind { 172; CHECK-LABEL: @ssub_2( 173; CHECK-NEXT: ret { i8, i1 } { i8 -2, i1 false } 174; 175 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 6) 176 ret {i8, i1} %t 177} 178 179define {i8, i1} @ssub_3() nounwind { 180; CHECK-LABEL: @ssub_3( 181; CHECK-NEXT: ret { i8, i1 } { i8 126, i1 true } 182; 183 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 120) 184 ret {i8, i1} %t 185} 186 187define {i8, i1} @ssub_3b() nounwind { 188; CHECK-LABEL: @ssub_3b( 189; CHECK-NEXT: ret { i8, i1 } { i8 -20, i1 false } 190; 191 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 10) 192 ret {i8, i1} %t 193} 194 195define {i8, i1} @ssub_4() nounwind { 196; CHECK-LABEL: @ssub_4( 197; CHECK-NEXT: ret { i8, i1 } { i8 -126, i1 true } 198; 199 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 120, i8 -10) 200 ret {i8, i1} %t 201} 202 203define {i8, i1} @ssub_4b() nounwind { 204; CHECK-LABEL: @ssub_4b( 205; CHECK-NEXT: ret { i8, i1 } { i8 30, i1 false } 206; 207 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 20, i8 -10) 208 ret {i8, i1} %t 209} 210 211define {i8, i1} @ssub_5() nounwind { 212; CHECK-LABEL: @ssub_5( 213; CHECK-NEXT: ret { i8, i1 } { i8 -10, i1 false } 214; 215 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -20, i8 -10) 216 ret {i8, i1} %t 217} 218 219define {i8, i1} @ssub_undef() nounwind { 220; CHECK-LABEL: @ssub_undef( 221; CHECK-NEXT: ret { i8, i1 } { i8 undef, i1 false } 222; 223 %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 undef, i8 -10) 224 ret {i8, i1} %t 225} 226 227;;----------------------------- 228;; smul 229;;----------------------------- 230 231define {i8, i1} @smul_1() nounwind { 232; CHECK-LABEL: @smul_1( 233; CHECK-NEXT: ret { i8, i1 } { i8 -56, i1 true } 234; 235 %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 -10) 236 ret {i8, i1} %t 237} 238 239define {i8, i1} @smul_undef() nounwind { 240; CHECK-LABEL: @smul_undef( 241; CHECK-NEXT: ret { i8, i1 } zeroinitializer 242; 243 %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 -20, i8 undef) 244 ret {i8, i1} %t 245} 246 247define {i8, i1} @smul_both_undef() nounwind { 248; CHECK-LABEL: @smul_both_undef( 249; CHECK-NEXT: ret { i8, i1 } zeroinitializer 250; 251 %t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 undef, i8 undef) 252 ret {i8, i1} %t 253} 254