1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefixes=CHECK,SDAG,GENERIC 3; RUN: llc -mtriple=x86_64-darwin-unknown -fast-isel -fast-isel-abort=1 < %s | FileCheck %s --check-prefixes=CHECK,FAST 4; RUN: llc -mtriple=x86_64-darwin-unknown -mcpu=knl < %s | FileCheck %s --check-prefixes=CHECK,SDAG,KNL 5 6; 7; Get the actual value of the overflow bit. 8; 9; SADDO reg, reg 10define zeroext i1 @saddoi8(i8 signext %v1, i8 signext %v2, ptr %res) { 11; SDAG-LABEL: saddoi8: 12; SDAG: ## %bb.0: 13; SDAG-NEXT: addb %sil, %dil 14; SDAG-NEXT: seto %al 15; SDAG-NEXT: movb %dil, (%rdx) 16; SDAG-NEXT: retq 17; 18; FAST-LABEL: saddoi8: 19; FAST: ## %bb.0: 20; FAST-NEXT: addb %sil, %dil 21; FAST-NEXT: seto %al 22; FAST-NEXT: movb %dil, (%rdx) 23; FAST-NEXT: andb $1, %al 24; FAST-NEXT: retq 25 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 %v2) 26 %val = extractvalue {i8, i1} %t, 0 27 %obit = extractvalue {i8, i1} %t, 1 28 store i8 %val, ptr %res 29 ret i1 %obit 30} 31 32define zeroext i1 @saddoi16(i16 %v1, i16 %v2, ptr %res) { 33; SDAG-LABEL: saddoi16: 34; SDAG: ## %bb.0: 35; SDAG-NEXT: addw %si, %di 36; SDAG-NEXT: seto %al 37; SDAG-NEXT: movw %di, (%rdx) 38; SDAG-NEXT: retq 39; 40; FAST-LABEL: saddoi16: 41; FAST: ## %bb.0: 42; FAST-NEXT: addw %si, %di 43; FAST-NEXT: seto %al 44; FAST-NEXT: movw %di, (%rdx) 45; FAST-NEXT: andb $1, %al 46; FAST-NEXT: retq 47 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 %v2) 48 %val = extractvalue {i16, i1} %t, 0 49 %obit = extractvalue {i16, i1} %t, 1 50 store i16 %val, ptr %res 51 ret i1 %obit 52} 53 54define zeroext i1 @saddoi32(i32 %v1, i32 %v2, ptr %res) { 55; SDAG-LABEL: saddoi32: 56; SDAG: ## %bb.0: 57; SDAG-NEXT: addl %esi, %edi 58; SDAG-NEXT: seto %al 59; SDAG-NEXT: movl %edi, (%rdx) 60; SDAG-NEXT: retq 61; 62; FAST-LABEL: saddoi32: 63; FAST: ## %bb.0: 64; FAST-NEXT: addl %esi, %edi 65; FAST-NEXT: seto %al 66; FAST-NEXT: movl %edi, (%rdx) 67; FAST-NEXT: andb $1, %al 68; FAST-NEXT: retq 69 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 70 %val = extractvalue {i32, i1} %t, 0 71 %obit = extractvalue {i32, i1} %t, 1 72 store i32 %val, ptr %res 73 ret i1 %obit 74} 75 76define zeroext i1 @saddoi64(i64 %v1, i64 %v2, ptr %res) { 77; SDAG-LABEL: saddoi64: 78; SDAG: ## %bb.0: 79; SDAG-NEXT: addq %rsi, %rdi 80; SDAG-NEXT: seto %al 81; SDAG-NEXT: movq %rdi, (%rdx) 82; SDAG-NEXT: retq 83; 84; FAST-LABEL: saddoi64: 85; FAST: ## %bb.0: 86; FAST-NEXT: addq %rsi, %rdi 87; FAST-NEXT: seto %al 88; FAST-NEXT: movq %rdi, (%rdx) 89; FAST-NEXT: andb $1, %al 90; FAST-NEXT: retq 91 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 92 %val = extractvalue {i64, i1} %t, 0 93 %obit = extractvalue {i64, i1} %t, 1 94 store i64 %val, ptr %res 95 ret i1 %obit 96} 97 98; SADDO reg, 1 | INC 99define zeroext i1 @saddoinci8(i8 %v1, ptr %res) { 100; SDAG-LABEL: saddoinci8: 101; SDAG: ## %bb.0: 102; SDAG-NEXT: incb %dil 103; SDAG-NEXT: seto %al 104; SDAG-NEXT: movb %dil, (%rsi) 105; SDAG-NEXT: retq 106; 107; FAST-LABEL: saddoinci8: 108; FAST: ## %bb.0: 109; FAST-NEXT: incb %dil 110; FAST-NEXT: seto %al 111; FAST-NEXT: movb %dil, (%rsi) 112; FAST-NEXT: andb $1, %al 113; FAST-NEXT: retq 114 %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v1, i8 1) 115 %val = extractvalue {i8, i1} %t, 0 116 %obit = extractvalue {i8, i1} %t, 1 117 store i8 %val, ptr %res 118 ret i1 %obit 119} 120 121define zeroext i1 @saddoinci16(i16 %v1, ptr %res) { 122; SDAG-LABEL: saddoinci16: 123; SDAG: ## %bb.0: 124; SDAG-NEXT: incw %di 125; SDAG-NEXT: seto %al 126; SDAG-NEXT: movw %di, (%rsi) 127; SDAG-NEXT: retq 128; 129; FAST-LABEL: saddoinci16: 130; FAST: ## %bb.0: 131; FAST-NEXT: incw %di 132; FAST-NEXT: seto %al 133; FAST-NEXT: movw %di, (%rsi) 134; FAST-NEXT: andb $1, %al 135; FAST-NEXT: retq 136 %t = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %v1, i16 1) 137 %val = extractvalue {i16, i1} %t, 0 138 %obit = extractvalue {i16, i1} %t, 1 139 store i16 %val, ptr %res 140 ret i1 %obit 141} 142 143define zeroext i1 @saddoinci32(i32 %v1, ptr %res) { 144; SDAG-LABEL: saddoinci32: 145; SDAG: ## %bb.0: 146; SDAG-NEXT: incl %edi 147; SDAG-NEXT: seto %al 148; SDAG-NEXT: movl %edi, (%rsi) 149; SDAG-NEXT: retq 150; 151; FAST-LABEL: saddoinci32: 152; FAST: ## %bb.0: 153; FAST-NEXT: incl %edi 154; FAST-NEXT: seto %al 155; FAST-NEXT: movl %edi, (%rsi) 156; FAST-NEXT: andb $1, %al 157; FAST-NEXT: retq 158 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1) 159 %val = extractvalue {i32, i1} %t, 0 160 %obit = extractvalue {i32, i1} %t, 1 161 store i32 %val, ptr %res 162 ret i1 %obit 163} 164 165define zeroext i1 @saddoinci64(i64 %v1, ptr %res) { 166; SDAG-LABEL: saddoinci64: 167; SDAG: ## %bb.0: 168; SDAG-NEXT: incq %rdi 169; SDAG-NEXT: seto %al 170; SDAG-NEXT: movq %rdi, (%rsi) 171; SDAG-NEXT: retq 172; 173; FAST-LABEL: saddoinci64: 174; FAST: ## %bb.0: 175; FAST-NEXT: incq %rdi 176; FAST-NEXT: seto %al 177; FAST-NEXT: movq %rdi, (%rsi) 178; FAST-NEXT: andb $1, %al 179; FAST-NEXT: retq 180 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 1) 181 %val = extractvalue {i64, i1} %t, 0 182 %obit = extractvalue {i64, i1} %t, 1 183 store i64 %val, ptr %res 184 ret i1 %obit 185} 186 187; SADDO reg, imm | imm, reg 188define zeroext i1 @saddoi64imm1(i64 %v1, ptr %res) { 189; SDAG-LABEL: saddoi64imm1: 190; SDAG: ## %bb.0: 191; SDAG-NEXT: addq $2, %rdi 192; SDAG-NEXT: seto %al 193; SDAG-NEXT: movq %rdi, (%rsi) 194; SDAG-NEXT: retq 195; 196; FAST-LABEL: saddoi64imm1: 197; FAST: ## %bb.0: 198; FAST-NEXT: addq $2, %rdi 199; FAST-NEXT: seto %al 200; FAST-NEXT: movq %rdi, (%rsi) 201; FAST-NEXT: andb $1, %al 202; FAST-NEXT: retq 203 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 2, i64 %v1) 204 %val = extractvalue {i64, i1} %t, 0 205 %obit = extractvalue {i64, i1} %t, 1 206 store i64 %val, ptr %res 207 ret i1 %obit 208} 209 210; Check boundary conditions for large immediates. 211define zeroext i1 @saddoi64imm2(i64 %v1, ptr %res) { 212; SDAG-LABEL: saddoi64imm2: 213; SDAG: ## %bb.0: 214; SDAG-NEXT: addq $-2147483648, %rdi ## imm = 0x80000000 215; SDAG-NEXT: seto %al 216; SDAG-NEXT: movq %rdi, (%rsi) 217; SDAG-NEXT: retq 218; 219; FAST-LABEL: saddoi64imm2: 220; FAST: ## %bb.0: 221; FAST-NEXT: addq $-2147483648, %rdi ## imm = 0x80000000 222; FAST-NEXT: seto %al 223; FAST-NEXT: movq %rdi, (%rsi) 224; FAST-NEXT: andb $1, %al 225; FAST-NEXT: retq 226 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -2147483648) 227 %val = extractvalue {i64, i1} %t, 0 228 %obit = extractvalue {i64, i1} %t, 1 229 store i64 %val, ptr %res 230 ret i1 %obit 231} 232 233define zeroext i1 @saddoi64imm3(i64 %v1, ptr %res) { 234; SDAG-LABEL: saddoi64imm3: 235; SDAG: ## %bb.0: 236; SDAG-NEXT: movabsq $-21474836489, %rcx ## imm = 0xFFFFFFFAFFFFFFF7 237; SDAG-NEXT: addq %rdi, %rcx 238; SDAG-NEXT: seto %al 239; SDAG-NEXT: movq %rcx, (%rsi) 240; SDAG-NEXT: retq 241; 242; FAST-LABEL: saddoi64imm3: 243; FAST: ## %bb.0: 244; FAST-NEXT: movabsq $-21474836489, %rcx ## imm = 0xFFFFFFFAFFFFFFF7 245; FAST-NEXT: addq %rdi, %rcx 246; FAST-NEXT: seto %al 247; FAST-NEXT: movq %rcx, (%rsi) 248; FAST-NEXT: andb $1, %al 249; FAST-NEXT: retq 250 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 -21474836489) 251 %val = extractvalue {i64, i1} %t, 0 252 %obit = extractvalue {i64, i1} %t, 1 253 store i64 %val, ptr %res 254 ret i1 %obit 255} 256 257define zeroext i1 @saddoi64imm4(i64 %v1, ptr %res) { 258; SDAG-LABEL: saddoi64imm4: 259; SDAG: ## %bb.0: 260; SDAG-NEXT: addq $2147483647, %rdi ## imm = 0x7FFFFFFF 261; SDAG-NEXT: seto %al 262; SDAG-NEXT: movq %rdi, (%rsi) 263; SDAG-NEXT: retq 264; 265; FAST-LABEL: saddoi64imm4: 266; FAST: ## %bb.0: 267; FAST-NEXT: addq $2147483647, %rdi ## imm = 0x7FFFFFFF 268; FAST-NEXT: seto %al 269; FAST-NEXT: movq %rdi, (%rsi) 270; FAST-NEXT: andb $1, %al 271; FAST-NEXT: retq 272 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483647) 273 %val = extractvalue {i64, i1} %t, 0 274 %obit = extractvalue {i64, i1} %t, 1 275 store i64 %val, ptr %res 276 ret i1 %obit 277} 278 279define zeroext i1 @saddoi64imm5(i64 %v1, ptr %res) { 280; SDAG-LABEL: saddoi64imm5: 281; SDAG: ## %bb.0: 282; SDAG-NEXT: subq $-2147483648, %rdi ## imm = 0x80000000 283; SDAG-NEXT: seto %al 284; SDAG-NEXT: movq %rdi, (%rsi) 285; SDAG-NEXT: retq 286; 287; FAST-LABEL: saddoi64imm5: 288; FAST: ## %bb.0: 289; FAST-NEXT: movl $2147483648, %ecx ## imm = 0x80000000 290; FAST-NEXT: addq %rdi, %rcx 291; FAST-NEXT: seto %al 292; FAST-NEXT: movq %rcx, (%rsi) 293; FAST-NEXT: andb $1, %al 294; FAST-NEXT: retq 295 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 2147483648) 296 %val = extractvalue {i64, i1} %t, 0 297 %obit = extractvalue {i64, i1} %t, 1 298 store i64 %val, ptr %res 299 ret i1 %obit 300} 301 302; UADDO 303define zeroext i1 @uaddoi32(i32 %v1, i32 %v2, ptr %res) { 304; SDAG-LABEL: uaddoi32: 305; SDAG: ## %bb.0: 306; SDAG-NEXT: addl %esi, %edi 307; SDAG-NEXT: setb %al 308; SDAG-NEXT: movl %edi, (%rdx) 309; SDAG-NEXT: retq 310; 311; FAST-LABEL: uaddoi32: 312; FAST: ## %bb.0: 313; FAST-NEXT: addl %esi, %edi 314; FAST-NEXT: setb %al 315; FAST-NEXT: movl %edi, (%rdx) 316; FAST-NEXT: andb $1, %al 317; FAST-NEXT: retq 318 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 319 %val = extractvalue {i32, i1} %t, 0 320 %obit = extractvalue {i32, i1} %t, 1 321 store i32 %val, ptr %res 322 ret i1 %obit 323} 324 325define zeroext i1 @uaddoi64(i64 %v1, i64 %v2, ptr %res) { 326; SDAG-LABEL: uaddoi64: 327; SDAG: ## %bb.0: 328; SDAG-NEXT: addq %rsi, %rdi 329; SDAG-NEXT: setb %al 330; SDAG-NEXT: movq %rdi, (%rdx) 331; SDAG-NEXT: retq 332; 333; FAST-LABEL: uaddoi64: 334; FAST: ## %bb.0: 335; FAST-NEXT: addq %rsi, %rdi 336; FAST-NEXT: setb %al 337; FAST-NEXT: movq %rdi, (%rdx) 338; FAST-NEXT: andb $1, %al 339; FAST-NEXT: retq 340 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 341 %val = extractvalue {i64, i1} %t, 0 342 %obit = extractvalue {i64, i1} %t, 1 343 store i64 %val, ptr %res 344 ret i1 %obit 345} 346 347; UADDO reg, 1 | NOT INC 348define zeroext i1 @uaddoinci8(i8 %v1, ptr %res) { 349; SDAG-LABEL: uaddoinci8: 350; SDAG: ## %bb.0: 351; SDAG-NEXT: incb %dil 352; SDAG-NEXT: sete %al 353; SDAG-NEXT: movb %dil, (%rsi) 354; SDAG-NEXT: retq 355; 356; FAST-LABEL: uaddoinci8: 357; FAST: ## %bb.0: 358; FAST-NEXT: addb $1, %dil 359; FAST-NEXT: setb %al 360; FAST-NEXT: movb %dil, (%rsi) 361; FAST-NEXT: andb $1, %al 362; FAST-NEXT: retq 363 %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v1, i8 1) 364 %val = extractvalue {i8, i1} %t, 0 365 %obit = extractvalue {i8, i1} %t, 1 366 store i8 %val, ptr %res 367 ret i1 %obit 368} 369 370define zeroext i1 @uaddoinci16(i16 %v1, ptr %res) { 371; SDAG-LABEL: uaddoinci16: 372; SDAG: ## %bb.0: 373; SDAG-NEXT: incw %di 374; SDAG-NEXT: sete %al 375; SDAG-NEXT: movw %di, (%rsi) 376; SDAG-NEXT: retq 377; 378; FAST-LABEL: uaddoinci16: 379; FAST: ## %bb.0: 380; FAST-NEXT: addw $1, %di 381; FAST-NEXT: setb %al 382; FAST-NEXT: movw %di, (%rsi) 383; FAST-NEXT: andb $1, %al 384; FAST-NEXT: retq 385 %t = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %v1, i16 1) 386 %val = extractvalue {i16, i1} %t, 0 387 %obit = extractvalue {i16, i1} %t, 1 388 store i16 %val, ptr %res 389 ret i1 %obit 390} 391 392define zeroext i1 @uaddoinci32(i32 %v1, ptr %res) { 393; SDAG-LABEL: uaddoinci32: 394; SDAG: ## %bb.0: 395; SDAG-NEXT: incl %edi 396; SDAG-NEXT: sete %al 397; SDAG-NEXT: movl %edi, (%rsi) 398; SDAG-NEXT: retq 399; 400; FAST-LABEL: uaddoinci32: 401; FAST: ## %bb.0: 402; FAST-NEXT: addl $1, %edi 403; FAST-NEXT: setb %al 404; FAST-NEXT: movl %edi, (%rsi) 405; FAST-NEXT: andb $1, %al 406; FAST-NEXT: retq 407 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 1) 408 %val = extractvalue {i32, i1} %t, 0 409 %obit = extractvalue {i32, i1} %t, 1 410 store i32 %val, ptr %res 411 ret i1 %obit 412} 413 414define zeroext i1 @uaddoinci64(i64 %v1, ptr %res) { 415; SDAG-LABEL: uaddoinci64: 416; SDAG: ## %bb.0: 417; SDAG-NEXT: incq %rdi 418; SDAG-NEXT: sete %al 419; SDAG-NEXT: movq %rdi, (%rsi) 420; SDAG-NEXT: retq 421; 422; FAST-LABEL: uaddoinci64: 423; FAST: ## %bb.0: 424; FAST-NEXT: addq $1, %rdi 425; FAST-NEXT: setb %al 426; FAST-NEXT: movq %rdi, (%rsi) 427; FAST-NEXT: andb $1, %al 428; FAST-NEXT: retq 429 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 1) 430 %val = extractvalue {i64, i1} %t, 0 431 %obit = extractvalue {i64, i1} %t, 1 432 store i64 %val, ptr %res 433 ret i1 %obit 434} 435 436; SSUBO 437define zeroext i1 @ssuboi32(i32 %v1, i32 %v2, ptr %res) { 438; SDAG-LABEL: ssuboi32: 439; SDAG: ## %bb.0: 440; SDAG-NEXT: subl %esi, %edi 441; SDAG-NEXT: seto %al 442; SDAG-NEXT: movl %edi, (%rdx) 443; SDAG-NEXT: retq 444; 445; FAST-LABEL: ssuboi32: 446; FAST: ## %bb.0: 447; FAST-NEXT: subl %esi, %edi 448; FAST-NEXT: seto %al 449; FAST-NEXT: movl %edi, (%rdx) 450; FAST-NEXT: andb $1, %al 451; FAST-NEXT: retq 452 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 453 %val = extractvalue {i32, i1} %t, 0 454 %obit = extractvalue {i32, i1} %t, 1 455 store i32 %val, ptr %res 456 ret i1 %obit 457} 458 459define zeroext i1 @ssuboi64(i64 %v1, i64 %v2, ptr %res) { 460; SDAG-LABEL: ssuboi64: 461; SDAG: ## %bb.0: 462; SDAG-NEXT: subq %rsi, %rdi 463; SDAG-NEXT: seto %al 464; SDAG-NEXT: movq %rdi, (%rdx) 465; SDAG-NEXT: retq 466; 467; FAST-LABEL: ssuboi64: 468; FAST: ## %bb.0: 469; FAST-NEXT: subq %rsi, %rdi 470; FAST-NEXT: seto %al 471; FAST-NEXT: movq %rdi, (%rdx) 472; FAST-NEXT: andb $1, %al 473; FAST-NEXT: retq 474 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 475 %val = extractvalue {i64, i1} %t, 0 476 %obit = extractvalue {i64, i1} %t, 1 477 store i64 %val, ptr %res 478 ret i1 %obit 479} 480 481; USUBO 482define zeroext i1 @usuboi32(i32 %v1, i32 %v2, ptr %res) { 483; SDAG-LABEL: usuboi32: 484; SDAG: ## %bb.0: 485; SDAG-NEXT: subl %esi, %edi 486; SDAG-NEXT: setb %al 487; SDAG-NEXT: movl %edi, (%rdx) 488; SDAG-NEXT: retq 489; 490; FAST-LABEL: usuboi32: 491; FAST: ## %bb.0: 492; FAST-NEXT: subl %esi, %edi 493; FAST-NEXT: setb %al 494; FAST-NEXT: movl %edi, (%rdx) 495; FAST-NEXT: andb $1, %al 496; FAST-NEXT: retq 497 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 498 %val = extractvalue {i32, i1} %t, 0 499 %obit = extractvalue {i32, i1} %t, 1 500 store i32 %val, ptr %res 501 ret i1 %obit 502} 503 504define zeroext i1 @usuboi64(i64 %v1, i64 %v2, ptr %res) { 505; SDAG-LABEL: usuboi64: 506; SDAG: ## %bb.0: 507; SDAG-NEXT: subq %rsi, %rdi 508; SDAG-NEXT: setb %al 509; SDAG-NEXT: movq %rdi, (%rdx) 510; SDAG-NEXT: retq 511; 512; FAST-LABEL: usuboi64: 513; FAST: ## %bb.0: 514; FAST-NEXT: subq %rsi, %rdi 515; FAST-NEXT: setb %al 516; FAST-NEXT: movq %rdi, (%rdx) 517; FAST-NEXT: andb $1, %al 518; FAST-NEXT: retq 519 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 520 %val = extractvalue {i64, i1} %t, 0 521 %obit = extractvalue {i64, i1} %t, 1 522 store i64 %val, ptr %res 523 ret i1 %obit 524} 525 526; 527; Check the use of the overflow bit in combination with a select instruction. 528; 529define i32 @saddoselecti32(i32 %v1, i32 %v2) { 530; CHECK-LABEL: saddoselecti32: 531; CHECK: ## %bb.0: 532; CHECK-NEXT: movl %esi, %eax 533; CHECK-NEXT: movl %edi, %ecx 534; CHECK-NEXT: addl %esi, %ecx 535; CHECK-NEXT: cmovol %edi, %eax 536; CHECK-NEXT: retq 537 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 538 %obit = extractvalue {i32, i1} %t, 1 539 %ret = select i1 %obit, i32 %v1, i32 %v2 540 ret i32 %ret 541} 542 543define i64 @saddoselecti64(i64 %v1, i64 %v2) { 544; CHECK-LABEL: saddoselecti64: 545; CHECK: ## %bb.0: 546; CHECK-NEXT: movq %rsi, %rax 547; CHECK-NEXT: movq %rdi, %rcx 548; CHECK-NEXT: addq %rsi, %rcx 549; CHECK-NEXT: cmovoq %rdi, %rax 550; CHECK-NEXT: retq 551 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 552 %obit = extractvalue {i64, i1} %t, 1 553 %ret = select i1 %obit, i64 %v1, i64 %v2 554 ret i64 %ret 555} 556 557define i32 @uaddoselecti32(i32 %v1, i32 %v2) { 558; CHECK-LABEL: uaddoselecti32: 559; CHECK: ## %bb.0: 560; CHECK-NEXT: movl %esi, %eax 561; CHECK-NEXT: movl %edi, %ecx 562; CHECK-NEXT: addl %esi, %ecx 563; CHECK-NEXT: cmovbl %edi, %eax 564; CHECK-NEXT: retq 565 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 566 %obit = extractvalue {i32, i1} %t, 1 567 %ret = select i1 %obit, i32 %v1, i32 %v2 568 ret i32 %ret 569} 570 571define i64 @uaddoselecti64(i64 %v1, i64 %v2) { 572; CHECK-LABEL: uaddoselecti64: 573; CHECK: ## %bb.0: 574; CHECK-NEXT: movq %rsi, %rax 575; CHECK-NEXT: movq %rdi, %rcx 576; CHECK-NEXT: addq %rsi, %rcx 577; CHECK-NEXT: cmovbq %rdi, %rax 578; CHECK-NEXT: retq 579 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 580 %obit = extractvalue {i64, i1} %t, 1 581 %ret = select i1 %obit, i64 %v1, i64 %v2 582 ret i64 %ret 583} 584 585define i32 @ssuboselecti32(i32 %v1, i32 %v2) { 586; CHECK-LABEL: ssuboselecti32: 587; CHECK: ## %bb.0: 588; CHECK-NEXT: movl %esi, %eax 589; CHECK-NEXT: cmpl %esi, %edi 590; CHECK-NEXT: cmovol %edi, %eax 591; CHECK-NEXT: retq 592 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 593 %obit = extractvalue {i32, i1} %t, 1 594 %ret = select i1 %obit, i32 %v1, i32 %v2 595 ret i32 %ret 596} 597 598define i64 @ssuboselecti64(i64 %v1, i64 %v2) { 599; CHECK-LABEL: ssuboselecti64: 600; CHECK: ## %bb.0: 601; CHECK-NEXT: movq %rsi, %rax 602; CHECK-NEXT: cmpq %rsi, %rdi 603; CHECK-NEXT: cmovoq %rdi, %rax 604; CHECK-NEXT: retq 605 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 606 %obit = extractvalue {i64, i1} %t, 1 607 %ret = select i1 %obit, i64 %v1, i64 %v2 608 ret i64 %ret 609} 610 611define i32 @usuboselecti32(i32 %v1, i32 %v2) { 612; CHECK-LABEL: usuboselecti32: 613; CHECK: ## %bb.0: 614; CHECK-NEXT: movl %esi, %eax 615; CHECK-NEXT: cmpl %esi, %edi 616; CHECK-NEXT: cmovbl %edi, %eax 617; CHECK-NEXT: retq 618 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 619 %obit = extractvalue {i32, i1} %t, 1 620 %ret = select i1 %obit, i32 %v1, i32 %v2 621 ret i32 %ret 622} 623 624define i64 @usuboselecti64(i64 %v1, i64 %v2) { 625; CHECK-LABEL: usuboselecti64: 626; CHECK: ## %bb.0: 627; CHECK-NEXT: movq %rsi, %rax 628; CHECK-NEXT: cmpq %rsi, %rdi 629; CHECK-NEXT: cmovbq %rdi, %rax 630; CHECK-NEXT: retq 631 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 632 %obit = extractvalue {i64, i1} %t, 1 633 %ret = select i1 %obit, i64 %v1, i64 %v2 634 ret i64 %ret 635} 636 637; 638; Check the use of the overflow bit in combination with a branch instruction. 639; 640define zeroext i1 @saddobri32(i32 %v1, i32 %v2) { 641; SDAG-LABEL: saddobri32: 642; SDAG: ## %bb.0: 643; SDAG-NEXT: addl %esi, %edi 644; SDAG-NEXT: jo LBB31_1 645; SDAG-NEXT: ## %bb.2: ## %continue 646; SDAG-NEXT: movb $1, %al 647; SDAG-NEXT: retq 648; SDAG-NEXT: LBB31_1: ## %overflow 649; SDAG-NEXT: xorl %eax, %eax 650; SDAG-NEXT: retq 651; 652; FAST-LABEL: saddobri32: 653; FAST: ## %bb.0: 654; FAST-NEXT: addl %esi, %edi 655; FAST-NEXT: jo LBB31_1 656; FAST-NEXT: ## %bb.2: ## %continue 657; FAST-NEXT: movb $1, %al 658; FAST-NEXT: andb $1, %al 659; FAST-NEXT: retq 660; FAST-NEXT: LBB31_1: ## %overflow 661; FAST-NEXT: xorl %eax, %eax 662; FAST-NEXT: andb $1, %al 663; FAST-NEXT: ## kill: def $al killed $al killed $eax 664; FAST-NEXT: retq 665 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) 666 %val = extractvalue {i32, i1} %t, 0 667 %obit = extractvalue {i32, i1} %t, 1 668 br i1 %obit, label %overflow, label %continue, !prof !0 669 670overflow: 671 ret i1 false 672 673continue: 674 ret i1 true 675} 676 677define zeroext i1 @saddobri64(i64 %v1, i64 %v2) { 678; SDAG-LABEL: saddobri64: 679; SDAG: ## %bb.0: 680; SDAG-NEXT: addq %rsi, %rdi 681; SDAG-NEXT: jo LBB32_1 682; SDAG-NEXT: ## %bb.2: ## %continue 683; SDAG-NEXT: movb $1, %al 684; SDAG-NEXT: retq 685; SDAG-NEXT: LBB32_1: ## %overflow 686; SDAG-NEXT: xorl %eax, %eax 687; SDAG-NEXT: retq 688; 689; FAST-LABEL: saddobri64: 690; FAST: ## %bb.0: 691; FAST-NEXT: addq %rsi, %rdi 692; FAST-NEXT: jo LBB32_1 693; FAST-NEXT: ## %bb.2: ## %continue 694; FAST-NEXT: movb $1, %al 695; FAST-NEXT: andb $1, %al 696; FAST-NEXT: retq 697; FAST-NEXT: LBB32_1: ## %overflow 698; FAST-NEXT: xorl %eax, %eax 699; FAST-NEXT: andb $1, %al 700; FAST-NEXT: ## kill: def $al killed $al killed $eax 701; FAST-NEXT: retq 702 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) 703 %val = extractvalue {i64, i1} %t, 0 704 %obit = extractvalue {i64, i1} %t, 1 705 br i1 %obit, label %overflow, label %continue, !prof !0 706 707overflow: 708 ret i1 false 709 710continue: 711 ret i1 true 712} 713 714define zeroext i1 @uaddobri32(i32 %v1, i32 %v2) { 715; SDAG-LABEL: uaddobri32: 716; SDAG: ## %bb.0: 717; SDAG-NEXT: addl %esi, %edi 718; SDAG-NEXT: jb LBB33_1 719; SDAG-NEXT: ## %bb.2: ## %continue 720; SDAG-NEXT: movb $1, %al 721; SDAG-NEXT: retq 722; SDAG-NEXT: LBB33_1: ## %overflow 723; SDAG-NEXT: xorl %eax, %eax 724; SDAG-NEXT: retq 725; 726; FAST-LABEL: uaddobri32: 727; FAST: ## %bb.0: 728; FAST-NEXT: addl %esi, %edi 729; FAST-NEXT: jb LBB33_1 730; FAST-NEXT: ## %bb.2: ## %continue 731; FAST-NEXT: movb $1, %al 732; FAST-NEXT: andb $1, %al 733; FAST-NEXT: retq 734; FAST-NEXT: LBB33_1: ## %overflow 735; FAST-NEXT: xorl %eax, %eax 736; FAST-NEXT: andb $1, %al 737; FAST-NEXT: ## kill: def $al killed $al killed $eax 738; FAST-NEXT: retq 739 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) 740 %val = extractvalue {i32, i1} %t, 0 741 %obit = extractvalue {i32, i1} %t, 1 742 br i1 %obit, label %overflow, label %continue, !prof !0 743 744overflow: 745 ret i1 false 746 747continue: 748 ret i1 true 749} 750 751define zeroext i1 @uaddobri64(i64 %v1, i64 %v2) { 752; SDAG-LABEL: uaddobri64: 753; SDAG: ## %bb.0: 754; SDAG-NEXT: addq %rsi, %rdi 755; SDAG-NEXT: jb LBB34_1 756; SDAG-NEXT: ## %bb.2: ## %continue 757; SDAG-NEXT: movb $1, %al 758; SDAG-NEXT: retq 759; SDAG-NEXT: LBB34_1: ## %overflow 760; SDAG-NEXT: xorl %eax, %eax 761; SDAG-NEXT: retq 762; 763; FAST-LABEL: uaddobri64: 764; FAST: ## %bb.0: 765; FAST-NEXT: addq %rsi, %rdi 766; FAST-NEXT: jb LBB34_1 767; FAST-NEXT: ## %bb.2: ## %continue 768; FAST-NEXT: movb $1, %al 769; FAST-NEXT: andb $1, %al 770; FAST-NEXT: retq 771; FAST-NEXT: LBB34_1: ## %overflow 772; FAST-NEXT: xorl %eax, %eax 773; FAST-NEXT: andb $1, %al 774; FAST-NEXT: ## kill: def $al killed $al killed $eax 775; FAST-NEXT: retq 776 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) 777 %val = extractvalue {i64, i1} %t, 0 778 %obit = extractvalue {i64, i1} %t, 1 779 br i1 %obit, label %overflow, label %continue, !prof !0 780 781overflow: 782 ret i1 false 783 784continue: 785 ret i1 true 786} 787 788define zeroext i1 @ssubobri32(i32 %v1, i32 %v2) { 789; SDAG-LABEL: ssubobri32: 790; SDAG: ## %bb.0: 791; SDAG-NEXT: cmpl %esi, %edi 792; SDAG-NEXT: jo LBB35_1 793; SDAG-NEXT: ## %bb.2: ## %continue 794; SDAG-NEXT: movb $1, %al 795; SDAG-NEXT: retq 796; SDAG-NEXT: LBB35_1: ## %overflow 797; SDAG-NEXT: xorl %eax, %eax 798; SDAG-NEXT: retq 799; 800; FAST-LABEL: ssubobri32: 801; FAST: ## %bb.0: 802; FAST-NEXT: cmpl %esi, %edi 803; FAST-NEXT: jo LBB35_1 804; FAST-NEXT: ## %bb.2: ## %continue 805; FAST-NEXT: movb $1, %al 806; FAST-NEXT: andb $1, %al 807; FAST-NEXT: retq 808; FAST-NEXT: LBB35_1: ## %overflow 809; FAST-NEXT: xorl %eax, %eax 810; FAST-NEXT: andb $1, %al 811; FAST-NEXT: ## kill: def $al killed $al killed $eax 812; FAST-NEXT: retq 813 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 814 %val = extractvalue {i32, i1} %t, 0 815 %obit = extractvalue {i32, i1} %t, 1 816 br i1 %obit, label %overflow, label %continue, !prof !0 817 818overflow: 819 ret i1 false 820 821continue: 822 ret i1 true 823} 824 825define zeroext i1 @ssubobri64(i64 %v1, i64 %v2) { 826; SDAG-LABEL: ssubobri64: 827; SDAG: ## %bb.0: 828; SDAG-NEXT: cmpq %rsi, %rdi 829; SDAG-NEXT: jo LBB36_1 830; SDAG-NEXT: ## %bb.2: ## %continue 831; SDAG-NEXT: movb $1, %al 832; SDAG-NEXT: retq 833; SDAG-NEXT: LBB36_1: ## %overflow 834; SDAG-NEXT: xorl %eax, %eax 835; SDAG-NEXT: retq 836; 837; FAST-LABEL: ssubobri64: 838; FAST: ## %bb.0: 839; FAST-NEXT: cmpq %rsi, %rdi 840; FAST-NEXT: jo LBB36_1 841; FAST-NEXT: ## %bb.2: ## %continue 842; FAST-NEXT: movb $1, %al 843; FAST-NEXT: andb $1, %al 844; FAST-NEXT: retq 845; FAST-NEXT: LBB36_1: ## %overflow 846; FAST-NEXT: xorl %eax, %eax 847; FAST-NEXT: andb $1, %al 848; FAST-NEXT: ## kill: def $al killed $al killed $eax 849; FAST-NEXT: retq 850 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) 851 %val = extractvalue {i64, i1} %t, 0 852 %obit = extractvalue {i64, i1} %t, 1 853 br i1 %obit, label %overflow, label %continue, !prof !0 854 855overflow: 856 ret i1 false 857 858continue: 859 ret i1 true 860} 861 862define zeroext i1 @usubobri32(i32 %v1, i32 %v2) { 863; SDAG-LABEL: usubobri32: 864; SDAG: ## %bb.0: 865; SDAG-NEXT: cmpl %esi, %edi 866; SDAG-NEXT: jb LBB37_1 867; SDAG-NEXT: ## %bb.2: ## %continue 868; SDAG-NEXT: movb $1, %al 869; SDAG-NEXT: retq 870; SDAG-NEXT: LBB37_1: ## %overflow 871; SDAG-NEXT: xorl %eax, %eax 872; SDAG-NEXT: retq 873; 874; FAST-LABEL: usubobri32: 875; FAST: ## %bb.0: 876; FAST-NEXT: cmpl %esi, %edi 877; FAST-NEXT: jb LBB37_1 878; FAST-NEXT: ## %bb.2: ## %continue 879; FAST-NEXT: movb $1, %al 880; FAST-NEXT: andb $1, %al 881; FAST-NEXT: retq 882; FAST-NEXT: LBB37_1: ## %overflow 883; FAST-NEXT: xorl %eax, %eax 884; FAST-NEXT: andb $1, %al 885; FAST-NEXT: ## kill: def $al killed $al killed $eax 886; FAST-NEXT: retq 887 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 888 %val = extractvalue {i32, i1} %t, 0 889 %obit = extractvalue {i32, i1} %t, 1 890 br i1 %obit, label %overflow, label %continue, !prof !0 891 892overflow: 893 ret i1 false 894 895continue: 896 ret i1 true 897} 898 899define zeroext i1 @usubobri64(i64 %v1, i64 %v2) { 900; SDAG-LABEL: usubobri64: 901; SDAG: ## %bb.0: 902; SDAG-NEXT: cmpq %rsi, %rdi 903; SDAG-NEXT: jb LBB38_1 904; SDAG-NEXT: ## %bb.2: ## %continue 905; SDAG-NEXT: movb $1, %al 906; SDAG-NEXT: retq 907; SDAG-NEXT: LBB38_1: ## %overflow 908; SDAG-NEXT: xorl %eax, %eax 909; SDAG-NEXT: retq 910; 911; FAST-LABEL: usubobri64: 912; FAST: ## %bb.0: 913; FAST-NEXT: cmpq %rsi, %rdi 914; FAST-NEXT: jb LBB38_1 915; FAST-NEXT: ## %bb.2: ## %continue 916; FAST-NEXT: movb $1, %al 917; FAST-NEXT: andb $1, %al 918; FAST-NEXT: retq 919; FAST-NEXT: LBB38_1: ## %overflow 920; FAST-NEXT: xorl %eax, %eax 921; FAST-NEXT: andb $1, %al 922; FAST-NEXT: ## kill: def $al killed $al killed $eax 923; FAST-NEXT: retq 924 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) 925 %val = extractvalue {i64, i1} %t, 0 926 %obit = extractvalue {i64, i1} %t, 1 927 br i1 %obit, label %overflow, label %continue, !prof !0 928 929overflow: 930 ret i1 false 931 932continue: 933 ret i1 true 934} 935 936define {i64, i1} @saddoovf(i64 %a, i64 %b) { 937; CHECK-LABEL: saddoovf: 938; CHECK: ## %bb.0: 939; CHECK-NEXT: sarq $17, %rdi 940; CHECK-NEXT: shrq $31, %rsi 941; CHECK-NEXT: leaq (%rsi,%rdi), %rax 942; CHECK-NEXT: xorl %edx, %edx 943; CHECK-NEXT: retq 944 %1 = ashr i64 %a, 17 945 %2 = lshr i64 %b, 31 946 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %1, i64 %2) 947 ret {i64, i1} %t 948} 949 950define {i64, i1} @ssuboovf(i64 %a, i64 %b) { 951; CHECK-LABEL: ssuboovf: 952; CHECK: ## %bb.0: 953; CHECK-NEXT: movzwl %di, %eax 954; CHECK-NEXT: shrq $22, %rsi 955; CHECK-NEXT: subq %rsi, %rax 956; CHECK-NEXT: xorl %edx, %edx 957; CHECK-NEXT: retq 958 %1 = and i64 %a, 65535 959 %2 = lshr i64 %b, 22 960 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %1, i64 %2) 961 ret {i64, i1} %t 962} 963 964define {i64, i1} @uaddoovf(i64 %a, i64 %b) { 965; CHECK-LABEL: uaddoovf: 966; CHECK: ## %bb.0: 967; CHECK-NEXT: movzbl %dil, %ecx 968; CHECK-NEXT: movzbl %sil, %eax 969; CHECK-NEXT: addq %rcx, %rax 970; CHECK-NEXT: xorl %edx, %edx 971; CHECK-NEXT: retq 972 %1 = and i64 %a, 255 973 %2 = and i64 %b, 255 974 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %1, i64 %2) 975 ret {i64, i1} %t 976} 977 978define {i64, i1} @usuboovf(i64 %a, i64 %b) { 979; CHECK-LABEL: usuboovf: 980; CHECK: ## %bb.0: 981; CHECK-NEXT: movq %rsi, %rax 982; CHECK-NEXT: notq %rax 983; CHECK-NEXT: xorl %edx, %edx 984; CHECK-NEXT: retq 985 %t0 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 %a) 986 %v0 = extractvalue {i64, i1} %t0, 0 987 %o0 = extractvalue {i64, i1} %t0, 1 988 %t1 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 -1, i64 %b) 989 %v1 = extractvalue {i64, i1} %t1, 0 990 %o1 = extractvalue {i64, i1} %t1, 1 991 %oo = or i1 %o0, %o1 992 %t2 = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v0) 993 %v2 = extractvalue {i64, i1} %t2, 0 994 %o2 = extractvalue {i64, i1} %t2, 1 995 %ooo = or i1 %oo, %o2 996 %t = insertvalue {i64, i1} %t2, i1 %ooo, 1 997 ret {i64, i1} %t 998} 999 1000; Make sure we select an INC for both the data use and the flag use. 1001define i32 @incovfselectstore(i32 %v1, i32 %v2, ptr %x) { 1002; CHECK-LABEL: incovfselectstore: 1003; CHECK: ## %bb.0: 1004; CHECK-NEXT: movl %esi, %eax 1005; CHECK-NEXT: movl %edi, %ecx 1006; CHECK-NEXT: incl %ecx 1007; CHECK-NEXT: cmovol %edi, %eax 1008; CHECK-NEXT: movl %ecx, (%rdx) 1009; CHECK-NEXT: retq 1010 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 1) 1011 %obit = extractvalue {i32, i1} %t, 1 1012 %ret = select i1 %obit, i32 %v1, i32 %v2 1013 %val = extractvalue {i32, i1} %t, 0 1014 store i32 %val, ptr %x 1015 ret i32 %ret 1016} 1017 1018; Make sure we select a DEC for both the data use and the flag use. 1019define i32 @decovfselectstore(i32 %v1, i32 %v2, ptr %x) { 1020; GENERIC-LABEL: decovfselectstore: 1021; GENERIC: ## %bb.0: 1022; GENERIC-NEXT: movl %esi, %eax 1023; GENERIC-NEXT: movl %edi, %ecx 1024; GENERIC-NEXT: decl %ecx 1025; GENERIC-NEXT: cmovol %edi, %eax 1026; GENERIC-NEXT: movl %ecx, (%rdx) 1027; GENERIC-NEXT: retq 1028; 1029; FAST-LABEL: decovfselectstore: 1030; FAST: ## %bb.0: 1031; FAST-NEXT: movl %esi, %eax 1032; FAST-NEXT: movl %edi, %ecx 1033; FAST-NEXT: decl %ecx 1034; FAST-NEXT: cmovol %edi, %eax 1035; FAST-NEXT: movl %ecx, (%rdx) 1036; FAST-NEXT: retq 1037; 1038; KNL-LABEL: decovfselectstore: 1039; KNL: ## %bb.0: 1040; KNL-NEXT: movl %esi, %eax 1041; KNL-NEXT: movl %edi, %ecx 1042; KNL-NEXT: addl $-1, %ecx 1043; KNL-NEXT: cmovol %edi, %eax 1044; KNL-NEXT: movl %ecx, (%rdx) 1045; KNL-NEXT: retq 1046 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 1) 1047 %obit = extractvalue {i32, i1} %t, 1 1048 %ret = select i1 %obit, i32 %v1, i32 %v2 1049 %val = extractvalue {i32, i1} %t, 0 1050 store i32 %val, ptr %x 1051 ret i32 %ret 1052} 1053 1054declare {i8, i1} @llvm.sadd.with.overflow.i8 (i8, i8 ) nounwind readnone 1055declare {i16, i1} @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone 1056declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone 1057declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone 1058declare {i8, i1} @llvm.uadd.with.overflow.i8 (i8, i8 ) nounwind readnone 1059declare {i16, i1} @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone 1060declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone 1061declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone 1062declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone 1063declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone 1064declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone 1065declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone 1066 1067!0 = !{!"branch_weights", i32 0, i32 2147483647} 1068