497 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X643; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+cmov | FileCheck %s --check-prefixes=CMOV4; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=NOCMOV5 6; PR468097 8define i32 @sadd_add_imm(i32 %x, i32 %y) {9; X64-LABEL: sadd_add_imm:10; X64: # %bb.0:11; X64-NEXT: # kill: def $edi killed $edi def $rdi12; X64-NEXT: addl %esi, %edi13; X64-NEXT: leal 100(%rdi), %eax14; X64-NEXT: cmovnol %edi, %eax15; X64-NEXT: retq16;17; CMOV-LABEL: sadd_add_imm:18; CMOV: # %bb.0:19; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx20; CMOV-NEXT: addl {{[0-9]+}}(%esp), %ecx21; CMOV-NEXT: leal 100(%ecx), %eax22; CMOV-NEXT: cmovnol %ecx, %eax23; CMOV-NEXT: retl24;25; NOCMOV-LABEL: sadd_add_imm:26; NOCMOV: # %bb.0:27; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax28; NOCMOV-NEXT: addl {{[0-9]+}}(%esp), %eax29; NOCMOV-NEXT: jno .LBB0_230; NOCMOV-NEXT: # %bb.1:31; NOCMOV-NEXT: addl $100, %eax32; NOCMOV-NEXT: .LBB0_2:33; NOCMOV-NEXT: retl34 %o = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)35 %v1 = extractvalue { i32, i1 } %o, 136 %v2 = extractvalue { i32, i1 } %o, 037 %a = add i32 %v2, 10038 %r = select i1 %v1, i32 %a, i32 %v239 ret i32 %r40}41 42define i32 @sadd_add_load(i32 %x, i32 %y, ptr %pz) nounwind {43; X64-LABEL: sadd_add_load:44; X64: # %bb.0:45; X64-NEXT: # kill: def $esi killed $esi def $rsi46; X64-NEXT: # kill: def $edi killed $edi def $rdi47; X64-NEXT: leal (%rdi,%rsi), %eax48; X64-NEXT: addl (%rdx), %eax49; X64-NEXT: addl %esi, %edi50; X64-NEXT: cmovnol %edi, %eax51; X64-NEXT: retq52;53; CMOV-LABEL: sadd_add_load:54; CMOV: # %bb.0:55; CMOV-NEXT: pushl %esi56; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx57; CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax58; CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx59; CMOV-NEXT: leal (%eax,%edx), %esi60; CMOV-NEXT: addl (%ecx), %esi61; CMOV-NEXT: addl %edx, %eax62; CMOV-NEXT: cmovol %esi, %eax63; CMOV-NEXT: popl %esi64; CMOV-NEXT: retl65;66; NOCMOV-LABEL: sadd_add_load:67; NOCMOV: # %bb.0:68; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax69; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx70; NOCMOV-NEXT: leal (%eax,%edx), %ecx71; NOCMOV-NEXT: addl %edx, %eax72; NOCMOV-NEXT: jno .LBB1_273; NOCMOV-NEXT: # %bb.1:74; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax75; NOCMOV-NEXT: addl (%eax), %ecx76; NOCMOV-NEXT: movl %ecx, %eax77; NOCMOV-NEXT: .LBB1_2:78; NOCMOV-NEXT: retl79 %o = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 %y)80 %v1 = extractvalue { i32, i1 } %o, 181 %v2 = extractvalue { i32, i1 } %o, 082 %z = load i32, ptr %pz83 %a = add i32 %v2, %z84 %r = select i1 %v1, i32 %a, i32 %v285 ret i32 %r86}87 88define i32 @uadd_add_imm(i32 %x, i32 %y) {89; X64-LABEL: uadd_add_imm:90; X64: # %bb.0:91; X64-NEXT: # kill: def $edi killed $edi def $rdi92; X64-NEXT: addl %esi, %edi93; X64-NEXT: leal 100(%rdi), %eax94; X64-NEXT: cmovael %edi, %eax95; X64-NEXT: retq96;97; CMOV-LABEL: uadd_add_imm:98; CMOV: # %bb.0:99; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx100; CMOV-NEXT: addl {{[0-9]+}}(%esp), %ecx101; CMOV-NEXT: leal 100(%ecx), %eax102; CMOV-NEXT: cmovael %ecx, %eax103; CMOV-NEXT: retl104;105; NOCMOV-LABEL: uadd_add_imm:106; NOCMOV: # %bb.0:107; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax108; NOCMOV-NEXT: addl {{[0-9]+}}(%esp), %eax109; NOCMOV-NEXT: jae .LBB2_2110; NOCMOV-NEXT: # %bb.1:111; NOCMOV-NEXT: addl $100, %eax112; NOCMOV-NEXT: .LBB2_2:113; NOCMOV-NEXT: retl114 %o = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)115 %v1 = extractvalue { i32, i1 } %o, 1116 %v2 = extractvalue { i32, i1 } %o, 0117 %a = add i32 %v2, 100118 %r = select i1 %v1, i32 %a, i32 %v2119 ret i32 %r120}121 122define i32 @uadd_add_load(i32 %x, i32 %y, ptr %pz) nounwind {123; X64-LABEL: uadd_add_load:124; X64: # %bb.0:125; X64-NEXT: # kill: def $esi killed $esi def $rsi126; X64-NEXT: # kill: def $edi killed $edi def $rdi127; X64-NEXT: leal (%rdi,%rsi), %eax128; X64-NEXT: addl (%rdx), %eax129; X64-NEXT: addl %esi, %edi130; X64-NEXT: cmovael %edi, %eax131; X64-NEXT: retq132;133; CMOV-LABEL: uadd_add_load:134; CMOV: # %bb.0:135; CMOV-NEXT: pushl %esi136; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx137; CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax138; CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx139; CMOV-NEXT: leal (%eax,%edx), %esi140; CMOV-NEXT: addl (%ecx), %esi141; CMOV-NEXT: addl %edx, %eax142; CMOV-NEXT: cmovbl %esi, %eax143; CMOV-NEXT: popl %esi144; CMOV-NEXT: retl145;146; NOCMOV-LABEL: uadd_add_load:147; NOCMOV: # %bb.0:148; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax149; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx150; NOCMOV-NEXT: leal (%eax,%edx), %ecx151; NOCMOV-NEXT: addl %edx, %eax152; NOCMOV-NEXT: jae .LBB3_2153; NOCMOV-NEXT: # %bb.1:154; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax155; NOCMOV-NEXT: addl (%eax), %ecx156; NOCMOV-NEXT: movl %ecx, %eax157; NOCMOV-NEXT: .LBB3_2:158; NOCMOV-NEXT: retl159 %o = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)160 %v1 = extractvalue { i32, i1 } %o, 1161 %v2 = extractvalue { i32, i1 } %o, 0162 %z = load i32, ptr %pz163 %a = add i32 %v2, %z164 %r = select i1 %v1, i32 %a, i32 %v2165 ret i32 %r166}167 168define i32 @ssub_add_imm(i32 %x, i32 %y) {169; X64-LABEL: ssub_add_imm:170; X64: # %bb.0:171; X64-NEXT: # kill: def $edi killed $edi def $rdi172; X64-NEXT: subl %esi, %edi173; X64-NEXT: leal 100(%rdi), %eax174; X64-NEXT: cmovnol %edi, %eax175; X64-NEXT: retq176;177; CMOV-LABEL: ssub_add_imm:178; CMOV: # %bb.0:179; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx180; CMOV-NEXT: subl {{[0-9]+}}(%esp), %ecx181; CMOV-NEXT: leal 100(%ecx), %eax182; CMOV-NEXT: cmovnol %ecx, %eax183; CMOV-NEXT: retl184;185; NOCMOV-LABEL: ssub_add_imm:186; NOCMOV: # %bb.0:187; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax188; NOCMOV-NEXT: subl {{[0-9]+}}(%esp), %eax189; NOCMOV-NEXT: jno .LBB4_2190; NOCMOV-NEXT: # %bb.1:191; NOCMOV-NEXT: addl $100, %eax192; NOCMOV-NEXT: .LBB4_2:193; NOCMOV-NEXT: retl194 %o = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)195 %v1 = extractvalue { i32, i1 } %o, 1196 %v2 = extractvalue { i32, i1 } %o, 0197 %a = add i32 %v2, 100198 %r = select i1 %v1, i32 %a, i32 %v2199 ret i32 %r200}201 202define i32 @ssub_add_load(i32 %x, i32 %y, ptr %pz) nounwind {203; X64-LABEL: ssub_add_load:204; X64: # %bb.0:205; X64-NEXT: movl %edi, %eax206; X64-NEXT: subl %esi, %eax207; X64-NEXT: addl (%rdx), %eax208; X64-NEXT: subl %esi, %edi209; X64-NEXT: cmovnol %edi, %eax210; X64-NEXT: retq211;212; CMOV-LABEL: ssub_add_load:213; CMOV: # %bb.0:214; CMOV-NEXT: pushl %esi215; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx216; CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax217; CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx218; CMOV-NEXT: movl %eax, %esi219; CMOV-NEXT: subl %edx, %esi220; CMOV-NEXT: addl (%ecx), %esi221; CMOV-NEXT: subl %edx, %eax222; CMOV-NEXT: cmovol %esi, %eax223; CMOV-NEXT: popl %esi224; CMOV-NEXT: retl225;226; NOCMOV-LABEL: ssub_add_load:227; NOCMOV: # %bb.0:228; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax229; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx230; NOCMOV-NEXT: movl %eax, %ecx231; NOCMOV-NEXT: subl %edx, %ecx232; NOCMOV-NEXT: subl %edx, %eax233; NOCMOV-NEXT: jno .LBB5_2234; NOCMOV-NEXT: # %bb.1:235; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax236; NOCMOV-NEXT: addl (%eax), %ecx237; NOCMOV-NEXT: movl %ecx, %eax238; NOCMOV-NEXT: .LBB5_2:239; NOCMOV-NEXT: retl240 %o = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)241 %v1 = extractvalue { i32, i1 } %o, 1242 %v2 = extractvalue { i32, i1 } %o, 0243 %z = load i32, ptr %pz244 %a = add i32 %v2, %z245 %r = select i1 %v1, i32 %a, i32 %v2246 ret i32 %r247}248 249define i32 @usub_add_imm(i32 %x, i32 %y) {250; X64-LABEL: usub_add_imm:251; X64: # %bb.0:252; X64-NEXT: # kill: def $edi killed $edi def $rdi253; X64-NEXT: subl %esi, %edi254; X64-NEXT: leal 100(%rdi), %eax255; X64-NEXT: cmovael %edi, %eax256; X64-NEXT: retq257;258; CMOV-LABEL: usub_add_imm:259; CMOV: # %bb.0:260; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx261; CMOV-NEXT: subl {{[0-9]+}}(%esp), %ecx262; CMOV-NEXT: leal 100(%ecx), %eax263; CMOV-NEXT: cmovael %ecx, %eax264; CMOV-NEXT: retl265;266; NOCMOV-LABEL: usub_add_imm:267; NOCMOV: # %bb.0:268; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax269; NOCMOV-NEXT: subl {{[0-9]+}}(%esp), %eax270; NOCMOV-NEXT: jae .LBB6_2271; NOCMOV-NEXT: # %bb.1:272; NOCMOV-NEXT: addl $100, %eax273; NOCMOV-NEXT: .LBB6_2:274; NOCMOV-NEXT: retl275 %o = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %x, i32 %y)276 %v1 = extractvalue { i32, i1 } %o, 1277 %v2 = extractvalue { i32, i1 } %o, 0278 %a = add i32 %v2, 100279 %r = select i1 %v1, i32 %a, i32 %v2280 ret i32 %r281}282 283define i32 @usub_add_load(i32 %x, i32 %y, ptr %pz) nounwind {284; X64-LABEL: usub_add_load:285; X64: # %bb.0:286; X64-NEXT: movl %edi, %eax287; X64-NEXT: subl %esi, %eax288; X64-NEXT: addl (%rdx), %eax289; X64-NEXT: subl %esi, %edi290; X64-NEXT: cmovael %edi, %eax291; X64-NEXT: retq292;293; CMOV-LABEL: usub_add_load:294; CMOV: # %bb.0:295; CMOV-NEXT: pushl %esi296; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx297; CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax298; CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx299; CMOV-NEXT: movl %eax, %esi300; CMOV-NEXT: subl %edx, %esi301; CMOV-NEXT: addl (%ecx), %esi302; CMOV-NEXT: subl %edx, %eax303; CMOV-NEXT: cmovbl %esi, %eax304; CMOV-NEXT: popl %esi305; CMOV-NEXT: retl306;307; NOCMOV-LABEL: usub_add_load:308; NOCMOV: # %bb.0:309; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax310; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx311; NOCMOV-NEXT: movl %eax, %ecx312; NOCMOV-NEXT: subl %edx, %ecx313; NOCMOV-NEXT: subl %edx, %eax314; NOCMOV-NEXT: jae .LBB7_2315; NOCMOV-NEXT: # %bb.1:316; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax317; NOCMOV-NEXT: addl (%eax), %ecx318; NOCMOV-NEXT: movl %ecx, %eax319; NOCMOV-NEXT: .LBB7_2:320; NOCMOV-NEXT: retl321 %o = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %x, i32 %y)322 %v1 = extractvalue { i32, i1 } %o, 1323 %v2 = extractvalue { i32, i1 } %o, 0324 %z = load i32, ptr %pz325 %a = add i32 %v2, %z326 %r = select i1 %v1, i32 %a, i32 %v2327 ret i32 %r328}329 330define i32 @smul_add_imm(i32 %x, i32 %y) {331; X64-LABEL: smul_add_imm:332; X64: # %bb.0:333; X64-NEXT: # kill: def $edi killed $edi def $rdi334; X64-NEXT: imull %esi, %edi335; X64-NEXT: leal 100(%rdi), %eax336; X64-NEXT: cmovnol %edi, %eax337; X64-NEXT: retq338;339; CMOV-LABEL: smul_add_imm:340; CMOV: # %bb.0:341; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx342; CMOV-NEXT: imull {{[0-9]+}}(%esp), %ecx343; CMOV-NEXT: leal 100(%ecx), %eax344; CMOV-NEXT: cmovnol %ecx, %eax345; CMOV-NEXT: retl346;347; NOCMOV-LABEL: smul_add_imm:348; NOCMOV: # %bb.0:349; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax350; NOCMOV-NEXT: imull {{[0-9]+}}(%esp), %eax351; NOCMOV-NEXT: jno .LBB8_2352; NOCMOV-NEXT: # %bb.1:353; NOCMOV-NEXT: addl $100, %eax354; NOCMOV-NEXT: .LBB8_2:355; NOCMOV-NEXT: retl356 %o = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %x, i32 %y)357 %v1 = extractvalue { i32, i1 } %o, 1358 %v2 = extractvalue { i32, i1 } %o, 0359 %a = add i32 %v2, 100360 %r = select i1 %v1, i32 %a, i32 %v2361 ret i32 %r362}363 364define i32 @smul_add_load(i32 %x, i32 %y, ptr %pz) nounwind {365; X64-LABEL: smul_add_load:366; X64: # %bb.0:367; X64-NEXT: movl %edi, %eax368; X64-NEXT: imull %esi, %eax369; X64-NEXT: addl (%rdx), %eax370; X64-NEXT: imull %esi, %edi371; X64-NEXT: cmovnol %edi, %eax372; X64-NEXT: retq373;374; CMOV-LABEL: smul_add_load:375; CMOV: # %bb.0:376; CMOV-NEXT: pushl %esi377; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx378; CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax379; CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx380; CMOV-NEXT: movl %eax, %esi381; CMOV-NEXT: imull %edx, %esi382; CMOV-NEXT: addl (%ecx), %esi383; CMOV-NEXT: imull %edx, %eax384; CMOV-NEXT: cmovol %esi, %eax385; CMOV-NEXT: popl %esi386; CMOV-NEXT: retl387;388; NOCMOV-LABEL: smul_add_load:389; NOCMOV: # %bb.0:390; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax391; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %edx392; NOCMOV-NEXT: movl %eax, %ecx393; NOCMOV-NEXT: imull %edx, %ecx394; NOCMOV-NEXT: imull %edx, %eax395; NOCMOV-NEXT: jno .LBB9_2396; NOCMOV-NEXT: # %bb.1:397; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax398; NOCMOV-NEXT: addl (%eax), %ecx399; NOCMOV-NEXT: movl %ecx, %eax400; NOCMOV-NEXT: .LBB9_2:401; NOCMOV-NEXT: retl402 %o = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %x, i32 %y)403 %v1 = extractvalue { i32, i1 } %o, 1404 %v2 = extractvalue { i32, i1 } %o, 0405 %z = load i32, ptr %pz406 %a = add i32 %v2, %z407 %r = select i1 %v1, i32 %a, i32 %v2408 ret i32 %r409}410 411define i32 @umul_add_imm(i32 %x, i32 %y) {412; X64-LABEL: umul_add_imm:413; X64: # %bb.0:414; X64-NEXT: movl %edi, %eax415; X64-NEXT: mull %esi416; X64-NEXT: # kill: def $eax killed $eax def $rax417; X64-NEXT: leal 100(%rax), %ecx418; X64-NEXT: cmovol %ecx, %eax419; X64-NEXT: # kill: def $eax killed $eax killed $rax420; X64-NEXT: retq421;422; CMOV-LABEL: umul_add_imm:423; CMOV: # %bb.0:424; CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax425; CMOV-NEXT: mull {{[0-9]+}}(%esp)426; CMOV-NEXT: leal 100(%eax), %ecx427; CMOV-NEXT: cmovol %ecx, %eax428; CMOV-NEXT: retl429;430; NOCMOV-LABEL: umul_add_imm:431; NOCMOV: # %bb.0:432; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax433; NOCMOV-NEXT: mull {{[0-9]+}}(%esp)434; NOCMOV-NEXT: jno .LBB10_2435; NOCMOV-NEXT: # %bb.1:436; NOCMOV-NEXT: addl $100, %eax437; NOCMOV-NEXT: .LBB10_2:438; NOCMOV-NEXT: retl439 %o = tail call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %x, i32 %y)440 %v1 = extractvalue { i32, i1 } %o, 1441 %v2 = extractvalue { i32, i1 } %o, 0442 %a = add i32 %v2, 100443 %r = select i1 %v1, i32 %a, i32 %v2444 ret i32 %r445}446 447define i32 @umul_add_load(i32 %x, i32 %y, ptr %pz) nounwind {448; X64-LABEL: umul_add_load:449; X64: # %bb.0:450; X64-NEXT: movq %rdx, %rcx451; X64-NEXT: movl %edi, %eax452; X64-NEXT: mull %esi453; X64-NEXT: seto %dl454; X64-NEXT: movl (%rcx), %ecx455; X64-NEXT: addl %eax, %ecx456; X64-NEXT: testb %dl, %dl457; X64-NEXT: cmovnel %ecx, %eax458; X64-NEXT: retq459;460; CMOV-LABEL: umul_add_load:461; CMOV: # %bb.0:462; CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx463; CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax464; CMOV-NEXT: mull {{[0-9]+}}(%esp)465; CMOV-NEXT: seto %dl466; CMOV-NEXT: movl (%ecx), %ecx467; CMOV-NEXT: addl %eax, %ecx468; CMOV-NEXT: testb %dl, %dl469; CMOV-NEXT: cmovnel %ecx, %eax470; CMOV-NEXT: retl471;472; NOCMOV-LABEL: umul_add_load:473; NOCMOV: # %bb.0:474; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax475; NOCMOV-NEXT: mull {{[0-9]+}}(%esp)476; NOCMOV-NEXT: jno .LBB11_2477; NOCMOV-NEXT: # %bb.1:478; NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx479; NOCMOV-NEXT: addl (%ecx), %eax480; NOCMOV-NEXT: .LBB11_2:481; NOCMOV-NEXT: retl482 %o = tail call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %x, i32 %y)483 %v1 = extractvalue { i32, i1 } %o, 1484 %v2 = extractvalue { i32, i1 } %o, 0485 %z = load i32, ptr %pz486 %a = add i32 %v2, %z487 %r = select i1 %v1, i32 %a, i32 %v2488 ret i32 %r489}490 491declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32)492declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32)493declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32)494declare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32)495declare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32)496declare { i32, i1 } @llvm.umul.with.overflow.i32(i32, i32)497