1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -instcombine < %s | FileCheck %s 3 4define i32 @uadd(i32 %x, i32 %y) { 5; CHECK-LABEL: @uadd( 6; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) 7; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1 8; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0 9; CHECK-NEXT: [[S:%.*]] = select i1 [[O]], i32 -1, i32 [[A]] 10; CHECK-NEXT: ret i32 [[S]] 11; 12 %ao = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y) 13 %o = extractvalue { i32, i1 } %ao, 1 14 %a = extractvalue { i32, i1 } %ao, 0 15 %s = select i1 %o, i32 -1, i32 %a 16 ret i32 %s 17} 18 19define i32 @usub(i32 %x, i32 %y) { 20; CHECK-LABEL: @usub( 21; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) 22; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1 23; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0 24; CHECK-NEXT: [[S:%.*]] = select i1 [[O]], i32 0, i32 [[A]] 25; CHECK-NEXT: ret i32 [[S]] 26; 27 %ao = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %x, i32 %y) 28 %o = extractvalue { i32, i1 } %ao, 1 29 %a = extractvalue { i32, i1 } %ao, 0 30 %s = select i1 %o, i32 0, i32 %a 31 ret i32 %s 32} 33 34 35define i8 @sadd_x_lt_min(i8 %x, i8 %y) { 36; CHECK-LABEL: @sadd_x_lt_min( 37; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 38; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 39; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 40; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 0 41; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 42; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 43; CHECK-NEXT: ret i8 [[R]] 44; 45 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 46 %o = extractvalue { i8, i1 } %ao, 1 47 %a = extractvalue { i8, i1 } %ao, 0 48 %c = icmp slt i8 %x, 0 49 %s = select i1 %c, i8 127, i8 -128 50 %r = select i1 %o, i8 %s, i8 %a 51 ret i8 %r 52} 53 54define i8 @sadd_x_lt_max(i8 %x, i8 %y) { 55; CHECK-LABEL: @sadd_x_lt_max( 56; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 57; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 58; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 59; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 0 60; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 61; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 62; CHECK-NEXT: ret i8 [[R]] 63; 64 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 65 %o = extractvalue { i8, i1 } %ao, 1 66 %a = extractvalue { i8, i1 } %ao, 0 67 %c = icmp slt i8 %x, 0 68 %s = select i1 %c, i8 -128, i8 127 69 %r = select i1 %o, i8 %s, i8 %a 70 ret i8 %r 71} 72 73define i8 @sadd_x_le_min(i8 %x, i8 %y) { 74; CHECK-LABEL: @sadd_x_le_min( 75; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 76; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 77; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 78; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1 79; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 80; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 81; CHECK-NEXT: ret i8 [[R]] 82; 83 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 84 %o = extractvalue { i8, i1 } %ao, 1 85 %a = extractvalue { i8, i1 } %ao, 0 86 %c = icmp sle i8 %x, 0 87 %s = select i1 %c, i8 127, i8 -128 88 %r = select i1 %o, i8 %s, i8 %a 89 ret i8 %r 90} 91 92define i8 @sadd_x_le_max(i8 %x, i8 %y) { 93; CHECK-LABEL: @sadd_x_le_max( 94; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 95; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 96; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 97; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1 98; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 99; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 100; CHECK-NEXT: ret i8 [[R]] 101; 102 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 103 %o = extractvalue { i8, i1 } %ao, 1 104 %a = extractvalue { i8, i1 } %ao, 0 105 %c = icmp sle i8 %x, 0 106 %s = select i1 %c, i8 -128, i8 127 107 %r = select i1 %o, i8 %s, i8 %a 108 ret i8 %r 109} 110 111define i8 @sadd_x_gt_min(i8 %x, i8 %y) { 112; CHECK-LABEL: @sadd_x_gt_min( 113; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 114; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 115; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 116; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0 117; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 118; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 119; CHECK-NEXT: ret i8 [[R]] 120; 121 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 122 %o = extractvalue { i8, i1 } %ao, 1 123 %a = extractvalue { i8, i1 } %ao, 0 124 %c = icmp sgt i8 %x, 0 125 %s = select i1 %c, i8 127, i8 -128 126 %r = select i1 %o, i8 %s, i8 %a 127 ret i8 %r 128} 129 130define i8 @sadd_x_gt_max(i8 %x, i8 %y) { 131; CHECK-LABEL: @sadd_x_gt_max( 132; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 133; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 134; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 135; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0 136; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 137; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 138; CHECK-NEXT: ret i8 [[R]] 139; 140 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 141 %o = extractvalue { i8, i1 } %ao, 1 142 %a = extractvalue { i8, i1 } %ao, 0 143 %c = icmp sgt i8 %x, 0 144 %s = select i1 %c, i8 -128, i8 127 145 %r = select i1 %o, i8 %s, i8 %a 146 ret i8 %r 147} 148 149define i8 @sadd_x_ge_min(i8 %x, i8 %y) { 150; CHECK-LABEL: @sadd_x_ge_min( 151; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 152; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 153; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 154; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1 155; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 156; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 157; CHECK-NEXT: ret i8 [[R]] 158; 159 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 160 %o = extractvalue { i8, i1 } %ao, 1 161 %a = extractvalue { i8, i1 } %ao, 0 162 %c = icmp sge i8 %x, 0 163 %s = select i1 %c, i8 127, i8 -128 164 %r = select i1 %o, i8 %s, i8 %a 165 ret i8 %r 166} 167 168define i8 @sadd_x_ge_max(i8 %x, i8 %y) { 169; CHECK-LABEL: @sadd_x_ge_max( 170; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 171; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 172; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 173; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1 174; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 175; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 176; CHECK-NEXT: ret i8 [[R]] 177; 178 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 179 %o = extractvalue { i8, i1 } %ao, 1 180 %a = extractvalue { i8, i1 } %ao, 0 181 %c = icmp sge i8 %x, 0 182 %s = select i1 %c, i8 -128, i8 127 183 %r = select i1 %o, i8 %s, i8 %a 184 ret i8 %r 185} 186 187 188define i8 @sadd_y_lt_min(i8 %x, i8 %y) { 189; CHECK-LABEL: @sadd_y_lt_min( 190; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 191; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 192; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 193; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0 194; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 195; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 196; CHECK-NEXT: ret i8 [[R]] 197; 198 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 199 %o = extractvalue { i8, i1 } %ao, 1 200 %a = extractvalue { i8, i1 } %ao, 0 201 %c = icmp slt i8 %y, 0 202 %s = select i1 %c, i8 127, i8 -128 203 %r = select i1 %o, i8 %s, i8 %a 204 ret i8 %r 205} 206 207define i8 @sadd_y_lt_max(i8 %x, i8 %y) { 208; CHECK-LABEL: @sadd_y_lt_max( 209; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 210; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 211; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 212; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0 213; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 214; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 215; CHECK-NEXT: ret i8 [[R]] 216; 217 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 218 %o = extractvalue { i8, i1 } %ao, 1 219 %a = extractvalue { i8, i1 } %ao, 0 220 %c = icmp slt i8 %y, 0 221 %s = select i1 %c, i8 -128, i8 127 222 %r = select i1 %o, i8 %s, i8 %a 223 ret i8 %r 224} 225 226define i8 @sadd_y_le_min(i8 %x, i8 %y) { 227; CHECK-LABEL: @sadd_y_le_min( 228; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 229; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 230; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 231; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1 232; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 233; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 234; CHECK-NEXT: ret i8 [[R]] 235; 236 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 237 %o = extractvalue { i8, i1 } %ao, 1 238 %a = extractvalue { i8, i1 } %ao, 0 239 %c = icmp sle i8 %y, 0 240 %s = select i1 %c, i8 127, i8 -128 241 %r = select i1 %o, i8 %s, i8 %a 242 ret i8 %r 243} 244 245define i8 @sadd_y_le_max(i8 %x, i8 %y) { 246; CHECK-LABEL: @sadd_y_le_max( 247; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 248; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 249; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 250; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1 251; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 252; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 253; CHECK-NEXT: ret i8 [[R]] 254; 255 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 256 %o = extractvalue { i8, i1 } %ao, 1 257 %a = extractvalue { i8, i1 } %ao, 0 258 %c = icmp sle i8 %y, 0 259 %s = select i1 %c, i8 -128, i8 127 260 %r = select i1 %o, i8 %s, i8 %a 261 ret i8 %r 262} 263 264define i8 @sadd_y_gt_min(i8 %x, i8 %y) { 265; CHECK-LABEL: @sadd_y_gt_min( 266; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 267; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 268; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 269; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0 270; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 271; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 272; CHECK-NEXT: ret i8 [[R]] 273; 274 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 275 %o = extractvalue { i8, i1 } %ao, 1 276 %a = extractvalue { i8, i1 } %ao, 0 277 %c = icmp sgt i8 %y, 0 278 %s = select i1 %c, i8 127, i8 -128 279 %r = select i1 %o, i8 %s, i8 %a 280 ret i8 %r 281} 282 283define i8 @sadd_y_gt_max(i8 %x, i8 %y) { 284; CHECK-LABEL: @sadd_y_gt_max( 285; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 286; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 287; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 288; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0 289; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 290; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 291; CHECK-NEXT: ret i8 [[R]] 292; 293 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 294 %o = extractvalue { i8, i1 } %ao, 1 295 %a = extractvalue { i8, i1 } %ao, 0 296 %c = icmp sgt i8 %y, 0 297 %s = select i1 %c, i8 -128, i8 127 298 %r = select i1 %o, i8 %s, i8 %a 299 ret i8 %r 300} 301 302define i8 @sadd_y_ge_min(i8 %x, i8 %y) { 303; CHECK-LABEL: @sadd_y_ge_min( 304; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 305; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 306; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 307; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1 308; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 309; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 310; CHECK-NEXT: ret i8 [[R]] 311; 312 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 313 %o = extractvalue { i8, i1 } %ao, 1 314 %a = extractvalue { i8, i1 } %ao, 0 315 %c = icmp sge i8 %y, 0 316 %s = select i1 %c, i8 127, i8 -128 317 %r = select i1 %o, i8 %s, i8 %a 318 ret i8 %r 319} 320 321define i8 @sadd_y_ge_max(i8 %x, i8 %y) { 322; CHECK-LABEL: @sadd_y_ge_max( 323; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 324; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 325; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 326; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1 327; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 328; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 329; CHECK-NEXT: ret i8 [[R]] 330; 331 %ao = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %x, i8 %y) 332 %o = extractvalue { i8, i1 } %ao, 1 333 %a = extractvalue { i8, i1 } %ao, 0 334 %c = icmp sge i8 %y, 0 335 %s = select i1 %c, i8 -128, i8 127 336 %r = select i1 %o, i8 %s, i8 %a 337 ret i8 %r 338} 339 340 341 342 343define i8 @ssub_x_lt_min(i8 %x, i8 %y) { 344; CHECK-LABEL: @ssub_x_lt_min( 345; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 346; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 347; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 348; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 0 349; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 350; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 351; CHECK-NEXT: ret i8 [[R]] 352; 353 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 354 %o = extractvalue { i8, i1 } %ao, 1 355 %a = extractvalue { i8, i1 } %ao, 0 356 %c = icmp slt i8 %x, 0 357 %s = select i1 %c, i8 127, i8 -128 358 %r = select i1 %o, i8 %s, i8 %a 359 ret i8 %r 360} 361 362define i8 @ssub_x_lt_max(i8 %x, i8 %y) { 363; CHECK-LABEL: @ssub_x_lt_max( 364; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 365; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 366; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 367; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 0 368; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 369; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 370; CHECK-NEXT: ret i8 [[R]] 371; 372 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 373 %o = extractvalue { i8, i1 } %ao, 1 374 %a = extractvalue { i8, i1 } %ao, 0 375 %c = icmp slt i8 %x, 0 376 %s = select i1 %c, i8 -128, i8 127 377 %r = select i1 %o, i8 %s, i8 %a 378 ret i8 %r 379} 380 381define i8 @ssub_x_le_min(i8 %x, i8 %y) { 382; CHECK-LABEL: @ssub_x_le_min( 383; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 384; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 385; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 386; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1 387; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 388; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 389; CHECK-NEXT: ret i8 [[R]] 390; 391 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 392 %o = extractvalue { i8, i1 } %ao, 1 393 %a = extractvalue { i8, i1 } %ao, 0 394 %c = icmp sle i8 %x, 0 395 %s = select i1 %c, i8 127, i8 -128 396 %r = select i1 %o, i8 %s, i8 %a 397 ret i8 %r 398} 399 400define i8 @ssub_x_le_max(i8 %x, i8 %y) { 401; CHECK-LABEL: @ssub_x_le_max( 402; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 403; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 404; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 405; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[X]], 1 406; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 407; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 408; CHECK-NEXT: ret i8 [[R]] 409; 410 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 411 %o = extractvalue { i8, i1 } %ao, 1 412 %a = extractvalue { i8, i1 } %ao, 0 413 %c = icmp sle i8 %x, 0 414 %s = select i1 %c, i8 -128, i8 127 415 %r = select i1 %o, i8 %s, i8 %a 416 ret i8 %r 417} 418 419define i8 @ssub_x_gt_min(i8 %x, i8 %y) { 420; CHECK-LABEL: @ssub_x_gt_min( 421; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 422; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 423; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 424; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0 425; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 426; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 427; CHECK-NEXT: ret i8 [[R]] 428; 429 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 430 %o = extractvalue { i8, i1 } %ao, 1 431 %a = extractvalue { i8, i1 } %ao, 0 432 %c = icmp sgt i8 %x, 0 433 %s = select i1 %c, i8 127, i8 -128 434 %r = select i1 %o, i8 %s, i8 %a 435 ret i8 %r 436} 437 438define i8 @ssub_x_gt_max(i8 %x, i8 %y) { 439; CHECK-LABEL: @ssub_x_gt_max( 440; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 441; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 442; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 443; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], 0 444; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 445; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 446; CHECK-NEXT: ret i8 [[R]] 447; 448 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 449 %o = extractvalue { i8, i1 } %ao, 1 450 %a = extractvalue { i8, i1 } %ao, 0 451 %c = icmp sgt i8 %x, 0 452 %s = select i1 %c, i8 -128, i8 127 453 %r = select i1 %o, i8 %s, i8 %a 454 ret i8 %r 455} 456 457define i8 @ssub_x_ge_min(i8 %x, i8 %y) { 458; CHECK-LABEL: @ssub_x_ge_min( 459; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 460; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 461; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 462; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1 463; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 464; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 465; CHECK-NEXT: ret i8 [[R]] 466; 467 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 468 %o = extractvalue { i8, i1 } %ao, 1 469 %a = extractvalue { i8, i1 } %ao, 0 470 %c = icmp sge i8 %x, 0 471 %s = select i1 %c, i8 127, i8 -128 472 %r = select i1 %o, i8 %s, i8 %a 473 ret i8 %r 474} 475 476define i8 @ssub_x_ge_max(i8 %x, i8 %y) { 477; CHECK-LABEL: @ssub_x_ge_max( 478; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 479; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 480; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 481; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[X]], -1 482; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 483; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 484; CHECK-NEXT: ret i8 [[R]] 485; 486 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 487 %o = extractvalue { i8, i1 } %ao, 1 488 %a = extractvalue { i8, i1 } %ao, 0 489 %c = icmp sge i8 %x, 0 490 %s = select i1 %c, i8 -128, i8 127 491 %r = select i1 %o, i8 %s, i8 %a 492 ret i8 %r 493} 494 495 496define i8 @ssub_y_lt_min(i8 %x, i8 %y) { 497; CHECK-LABEL: @ssub_y_lt_min( 498; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 499; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 500; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 501; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0 502; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 503; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 504; CHECK-NEXT: ret i8 [[R]] 505; 506 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 507 %o = extractvalue { i8, i1 } %ao, 1 508 %a = extractvalue { i8, i1 } %ao, 0 509 %c = icmp slt i8 %y, 0 510 %s = select i1 %c, i8 127, i8 -128 511 %r = select i1 %o, i8 %s, i8 %a 512 ret i8 %r 513} 514 515define i8 @ssub_y_lt_max(i8 %x, i8 %y) { 516; CHECK-LABEL: @ssub_y_lt_max( 517; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 518; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 519; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 520; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 0 521; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 522; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 523; CHECK-NEXT: ret i8 [[R]] 524; 525 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 526 %o = extractvalue { i8, i1 } %ao, 1 527 %a = extractvalue { i8, i1 } %ao, 0 528 %c = icmp slt i8 %y, 0 529 %s = select i1 %c, i8 -128, i8 127 530 %r = select i1 %o, i8 %s, i8 %a 531 ret i8 %r 532} 533 534define i8 @ssub_y_le_min(i8 %x, i8 %y) { 535; CHECK-LABEL: @ssub_y_le_min( 536; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 537; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 538; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 539; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1 540; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 541; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 542; CHECK-NEXT: ret i8 [[R]] 543; 544 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 545 %o = extractvalue { i8, i1 } %ao, 1 546 %a = extractvalue { i8, i1 } %ao, 0 547 %c = icmp sle i8 %y, 0 548 %s = select i1 %c, i8 127, i8 -128 549 %r = select i1 %o, i8 %s, i8 %a 550 ret i8 %r 551} 552 553define i8 @ssub_y_le_max(i8 %x, i8 %y) { 554; CHECK-LABEL: @ssub_y_le_max( 555; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 556; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 557; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 558; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[Y]], 1 559; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 560; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 561; CHECK-NEXT: ret i8 [[R]] 562; 563 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 564 %o = extractvalue { i8, i1 } %ao, 1 565 %a = extractvalue { i8, i1 } %ao, 0 566 %c = icmp sle i8 %y, 0 567 %s = select i1 %c, i8 -128, i8 127 568 %r = select i1 %o, i8 %s, i8 %a 569 ret i8 %r 570} 571 572define i8 @ssub_y_gt_min(i8 %x, i8 %y) { 573; CHECK-LABEL: @ssub_y_gt_min( 574; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 575; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 576; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 577; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0 578; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 579; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 580; CHECK-NEXT: ret i8 [[R]] 581; 582 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 583 %o = extractvalue { i8, i1 } %ao, 1 584 %a = extractvalue { i8, i1 } %ao, 0 585 %c = icmp sgt i8 %y, 0 586 %s = select i1 %c, i8 127, i8 -128 587 %r = select i1 %o, i8 %s, i8 %a 588 ret i8 %r 589} 590 591define i8 @ssub_y_gt_max(i8 %x, i8 %y) { 592; CHECK-LABEL: @ssub_y_gt_max( 593; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 594; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 595; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 596; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], 0 597; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 598; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 599; CHECK-NEXT: ret i8 [[R]] 600; 601 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 602 %o = extractvalue { i8, i1 } %ao, 1 603 %a = extractvalue { i8, i1 } %ao, 0 604 %c = icmp sgt i8 %y, 0 605 %s = select i1 %c, i8 -128, i8 127 606 %r = select i1 %o, i8 %s, i8 %a 607 ret i8 %r 608} 609 610define i8 @ssub_y_ge_min(i8 %x, i8 %y) { 611; CHECK-LABEL: @ssub_y_ge_min( 612; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 613; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 614; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 615; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1 616; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 127, i8 -128 617; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 618; CHECK-NEXT: ret i8 [[R]] 619; 620 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 621 %o = extractvalue { i8, i1 } %ao, 1 622 %a = extractvalue { i8, i1 } %ao, 0 623 %c = icmp sge i8 %y, 0 624 %s = select i1 %c, i8 127, i8 -128 625 %r = select i1 %o, i8 %s, i8 %a 626 ret i8 %r 627} 628 629define i8 @ssub_y_ge_max(i8 %x, i8 %y) { 630; CHECK-LABEL: @ssub_y_ge_max( 631; CHECK-NEXT: [[AO:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 632; CHECK-NEXT: [[O:%.*]] = extractvalue { i8, i1 } [[AO]], 1 633; CHECK-NEXT: [[A:%.*]] = extractvalue { i8, i1 } [[AO]], 0 634; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[Y]], -1 635; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i8 -128, i8 127 636; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i8 [[S]], i8 [[A]] 637; CHECK-NEXT: ret i8 [[R]] 638; 639 %ao = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %x, i8 %y) 640 %o = extractvalue { i8, i1 } %ao, 1 641 %a = extractvalue { i8, i1 } %ao, 0 642 %c = icmp sge i8 %y, 0 643 %s = select i1 %c, i8 -128, i8 127 644 %r = select i1 %o, i8 %s, i8 %a 645 ret i8 %r 646} 647 648 649define i32 @sadd_i32(i32 %x, i32 %y) { 650; CHECK-LABEL: @sadd_i32( 651; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) 652; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1 653; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0 654; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0 655; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -2147483648, i32 2147483647 656; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]] 657; CHECK-NEXT: ret i32 [[R]] 658; 659 %ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y) 660 %o = extractvalue { i32, i1 } %ao, 1 661 %a = extractvalue { i32, i1 } %ao, 0 662 %c = icmp slt i32 %x, 0 663 %s = select i1 %c, i32 -2147483648, i32 2147483647 664 %r = select i1 %o, i32 %s, i32 %a 665 ret i32 %r 666} 667 668define i32 @ssub_i32(i32 %x, i32 %y) { 669; CHECK-LABEL: @ssub_i32( 670; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) 671; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1 672; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0 673; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0 674; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -2147483648, i32 2147483647 675; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]] 676; CHECK-NEXT: ret i32 [[R]] 677; 678 %ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y) 679 %o = extractvalue { i32, i1 } %ao, 1 680 %a = extractvalue { i32, i1 } %ao, 0 681 %c = icmp slt i32 %x, 0 682 %s = select i1 %c, i32 -2147483648, i32 2147483647 683 %r = select i1 %o, i32 %s, i32 %a 684 ret i32 %r 685} 686 687define i32 @sadd_bounds(i32 %x, i32 %y) { 688; CHECK-LABEL: @sadd_bounds( 689; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) 690; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1 691; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0 692; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0 693; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -128, i32 127 694; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]] 695; CHECK-NEXT: ret i32 [[R]] 696; 697 %ao = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y) 698 %o = extractvalue { i32, i1 } %ao, 1 699 %a = extractvalue { i32, i1 } %ao, 0 700 %c = icmp slt i32 %x, 0 701 %s = select i1 %c, i32 -128, i32 127 702 %r = select i1 %o, i32 %s, i32 %a 703 ret i32 %r 704} 705 706define i32 @ssub_bounds(i32 %x, i32 %y) { 707; CHECK-LABEL: @ssub_bounds( 708; CHECK-NEXT: [[AO:%.*]] = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) 709; CHECK-NEXT: [[O:%.*]] = extractvalue { i32, i1 } [[AO]], 1 710; CHECK-NEXT: [[A:%.*]] = extractvalue { i32, i1 } [[AO]], 0 711; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 0 712; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 -128, i32 127 713; CHECK-NEXT: [[R:%.*]] = select i1 [[O]], i32 [[S]], i32 [[A]] 714; CHECK-NEXT: ret i32 [[R]] 715; 716 %ao = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y) 717 %o = extractvalue { i32, i1 } %ao, 1 718 %a = extractvalue { i32, i1 } %ao, 0 719 %c = icmp slt i32 %x, 0 720 %s = select i1 %c, i32 -128, i32 127 721 %r = select i1 %o, i32 %s, i32 %a 722 ret i32 %r 723} 724 725declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %0, i32 %1) 726declare { i32, i1 } @llvm.usub.with.overflow.i32(i32 %0, i32 %1) 727declare { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %0, i8 %1) 728declare { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %0, i8 %1) 729declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %0, i32 %1) 730declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %0, i32 %1) 731