1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -S -mtriple=x86_64-- -expand-large-div-rem -expand-div-rem-bits 128 < %s | FileCheck %s 3; RUN: opt -S -mtriple=x86_64-- -passes=expand-large-div-rem -expand-div-rem-bits 128 < %s | FileCheck %s 4 5define <2 x i129> @sdiv129(<2 x i129> %a, <2 x i129> %b) nounwind { 6; CHECK-LABEL: define <2 x i129> @sdiv129( 7; CHECK-SAME: <2 x i129> [[A:%.*]], <2 x i129> [[B:%.*]]) #[[ATTR0:[0-9]+]] { 8; CHECK-NEXT: _udiv-special-cases_udiv-special-cases: 9; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i129> [[A]], i64 0 10; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i129> [[B]], i64 0 11; CHECK-NEXT: [[TMP2:%.*]] = freeze i129 [[TMP0]] 12; CHECK-NEXT: [[TMP3:%.*]] = freeze i129 [[TMP1]] 13; CHECK-NEXT: [[TMP4:%.*]] = ashr i129 [[TMP2]], 128 14; CHECK-NEXT: [[TMP5:%.*]] = ashr i129 [[TMP3]], 128 15; CHECK-NEXT: [[TMP6:%.*]] = xor i129 [[TMP4]], [[TMP2]] 16; CHECK-NEXT: [[TMP7:%.*]] = sub i129 [[TMP6]], [[TMP4]] 17; CHECK-NEXT: [[TMP8:%.*]] = xor i129 [[TMP5]], [[TMP3]] 18; CHECK-NEXT: [[TMP9:%.*]] = sub i129 [[TMP8]], [[TMP5]] 19; CHECK-NEXT: [[TMP10:%.*]] = xor i129 [[TMP5]], [[TMP4]] 20; CHECK-NEXT: [[TMP11:%.*]] = freeze i129 [[TMP9]] 21; CHECK-NEXT: [[TMP12:%.*]] = freeze i129 [[TMP7]] 22; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i129 [[TMP11]], 0 23; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i129 [[TMP12]], 0 24; CHECK-NEXT: [[TMP15:%.*]] = or i1 [[TMP13]], [[TMP14]] 25; CHECK-NEXT: [[TMP16:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP11]], i1 true) 26; CHECK-NEXT: [[TMP17:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP12]], i1 true) 27; CHECK-NEXT: [[TMP18:%.*]] = sub i129 [[TMP16]], [[TMP17]] 28; CHECK-NEXT: [[TMP19:%.*]] = icmp ugt i129 [[TMP18]], 128 29; CHECK-NEXT: [[TMP20:%.*]] = select i1 [[TMP15]], i1 true, i1 [[TMP19]] 30; CHECK-NEXT: [[TMP21:%.*]] = icmp eq i129 [[TMP18]], 128 31; CHECK-NEXT: [[TMP22:%.*]] = select i1 [[TMP20]], i129 0, i129 [[TMP12]] 32; CHECK-NEXT: [[TMP23:%.*]] = select i1 [[TMP20]], i1 true, i1 [[TMP21]] 33; CHECK-NEXT: br i1 [[TMP23]], label [[UDIV_END1:%.*]], label [[UDIV_BB15:%.*]] 34; CHECK: udiv-loop-exit2: 35; CHECK-NEXT: [[TMP24:%.*]] = phi i129 [ 0, [[UDIV_BB15]] ], [ [[TMP39:%.*]], [[UDIV_DO_WHILE3:%.*]] ] 36; CHECK-NEXT: [[TMP25:%.*]] = phi i129 [ [[TMP48:%.*]], [[UDIV_BB15]] ], [ [[TMP36:%.*]], [[UDIV_DO_WHILE3]] ] 37; CHECK-NEXT: [[TMP26:%.*]] = shl i129 [[TMP25]], 1 38; CHECK-NEXT: [[TMP27:%.*]] = or i129 [[TMP24]], [[TMP26]] 39; CHECK-NEXT: br label [[UDIV_END1]] 40; CHECK: udiv-do-while3: 41; CHECK-NEXT: [[TMP28:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER4:%.*]] ], [ [[TMP39]], [[UDIV_DO_WHILE3]] ] 42; CHECK-NEXT: [[TMP29:%.*]] = phi i129 [ [[TMP46:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP42:%.*]], [[UDIV_DO_WHILE3]] ] 43; CHECK-NEXT: [[TMP30:%.*]] = phi i129 [ [[TMP44:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP41:%.*]], [[UDIV_DO_WHILE3]] ] 44; CHECK-NEXT: [[TMP31:%.*]] = phi i129 [ [[TMP48]], [[UDIV_PREHEADER4]] ], [ [[TMP36]], [[UDIV_DO_WHILE3]] ] 45; CHECK-NEXT: [[TMP32:%.*]] = shl i129 [[TMP30]], 1 46; CHECK-NEXT: [[TMP33:%.*]] = lshr i129 [[TMP31]], 128 47; CHECK-NEXT: [[TMP34:%.*]] = or i129 [[TMP32]], [[TMP33]] 48; CHECK-NEXT: [[TMP35:%.*]] = shl i129 [[TMP31]], 1 49; CHECK-NEXT: [[TMP36]] = or i129 [[TMP28]], [[TMP35]] 50; CHECK-NEXT: [[TMP37:%.*]] = sub i129 [[TMP45:%.*]], [[TMP34]] 51; CHECK-NEXT: [[TMP38:%.*]] = ashr i129 [[TMP37]], 128 52; CHECK-NEXT: [[TMP39]] = and i129 [[TMP38]], 1 53; CHECK-NEXT: [[TMP40:%.*]] = and i129 [[TMP38]], [[TMP11]] 54; CHECK-NEXT: [[TMP41]] = sub i129 [[TMP34]], [[TMP40]] 55; CHECK-NEXT: [[TMP42]] = add i129 [[TMP29]], -1 56; CHECK-NEXT: [[TMP43:%.*]] = icmp eq i129 [[TMP42]], 0 57; CHECK-NEXT: br i1 [[TMP43]], label [[UDIV_LOOP_EXIT2:%.*]], label [[UDIV_DO_WHILE3]] 58; CHECK: udiv-preheader4: 59; CHECK-NEXT: [[TMP44]] = lshr i129 [[TMP12]], [[TMP46]] 60; CHECK-NEXT: [[TMP45]] = add i129 [[TMP11]], -1 61; CHECK-NEXT: br label [[UDIV_DO_WHILE3]] 62; CHECK: udiv-bb15: 63; CHECK-NEXT: [[TMP46]] = add i129 [[TMP18]], 1 64; CHECK-NEXT: [[TMP47:%.*]] = sub i129 128, [[TMP18]] 65; CHECK-NEXT: [[TMP48]] = shl i129 [[TMP12]], [[TMP47]] 66; CHECK-NEXT: [[TMP49:%.*]] = icmp eq i129 [[TMP46]], 0 67; CHECK-NEXT: br i1 [[TMP49]], label [[UDIV_LOOP_EXIT2]], label [[UDIV_PREHEADER4]] 68; CHECK: udiv-end1: 69; CHECK-NEXT: [[TMP50:%.*]] = phi i129 [ [[TMP27]], [[UDIV_LOOP_EXIT2]] ], [ [[TMP22]], [[_UDIV_SPECIAL_CASES_UDIV_SPECIAL_CASES:%.*]] ] 70; CHECK-NEXT: [[TMP51:%.*]] = xor i129 [[TMP50]], [[TMP10]] 71; CHECK-NEXT: [[TMP52:%.*]] = sub i129 [[TMP51]], [[TMP10]] 72; CHECK-NEXT: [[TMP53:%.*]] = insertelement <2 x i129> poison, i129 [[TMP52]], i64 0 73; CHECK-NEXT: [[TMP54:%.*]] = extractelement <2 x i129> [[A]], i64 1 74; CHECK-NEXT: [[TMP55:%.*]] = extractelement <2 x i129> [[B]], i64 1 75; CHECK-NEXT: [[TMP56:%.*]] = freeze i129 [[TMP54]] 76; CHECK-NEXT: [[TMP57:%.*]] = freeze i129 [[TMP55]] 77; CHECK-NEXT: [[TMP58:%.*]] = ashr i129 [[TMP56]], 128 78; CHECK-NEXT: [[TMP59:%.*]] = ashr i129 [[TMP57]], 128 79; CHECK-NEXT: [[TMP60:%.*]] = xor i129 [[TMP58]], [[TMP56]] 80; CHECK-NEXT: [[TMP61:%.*]] = sub i129 [[TMP60]], [[TMP58]] 81; CHECK-NEXT: [[TMP62:%.*]] = xor i129 [[TMP59]], [[TMP57]] 82; CHECK-NEXT: [[TMP63:%.*]] = sub i129 [[TMP62]], [[TMP59]] 83; CHECK-NEXT: [[TMP64:%.*]] = xor i129 [[TMP59]], [[TMP58]] 84; CHECK-NEXT: [[TMP65:%.*]] = freeze i129 [[TMP63]] 85; CHECK-NEXT: [[TMP66:%.*]] = freeze i129 [[TMP61]] 86; CHECK-NEXT: [[TMP67:%.*]] = icmp eq i129 [[TMP65]], 0 87; CHECK-NEXT: [[TMP68:%.*]] = icmp eq i129 [[TMP66]], 0 88; CHECK-NEXT: [[TMP69:%.*]] = or i1 [[TMP67]], [[TMP68]] 89; CHECK-NEXT: [[TMP70:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP65]], i1 true) 90; CHECK-NEXT: [[TMP71:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP66]], i1 true) 91; CHECK-NEXT: [[TMP72:%.*]] = sub i129 [[TMP70]], [[TMP71]] 92; CHECK-NEXT: [[TMP73:%.*]] = icmp ugt i129 [[TMP72]], 128 93; CHECK-NEXT: [[TMP74:%.*]] = select i1 [[TMP69]], i1 true, i1 [[TMP73]] 94; CHECK-NEXT: [[TMP75:%.*]] = icmp eq i129 [[TMP72]], 128 95; CHECK-NEXT: [[TMP76:%.*]] = select i1 [[TMP74]], i129 0, i129 [[TMP66]] 96; CHECK-NEXT: [[TMP77:%.*]] = select i1 [[TMP74]], i1 true, i1 [[TMP75]] 97; CHECK-NEXT: br i1 [[TMP77]], label [[UDIV_END:%.*]], label [[UDIV_BB1:%.*]] 98; CHECK: udiv-loop-exit: 99; CHECK-NEXT: [[TMP78:%.*]] = phi i129 [ 0, [[UDIV_BB1]] ], [ [[TMP93:%.*]], [[UDIV_DO_WHILE:%.*]] ] 100; CHECK-NEXT: [[TMP79:%.*]] = phi i129 [ [[TMP102:%.*]], [[UDIV_BB1]] ], [ [[TMP90:%.*]], [[UDIV_DO_WHILE]] ] 101; CHECK-NEXT: [[TMP80:%.*]] = shl i129 [[TMP79]], 1 102; CHECK-NEXT: [[TMP81:%.*]] = or i129 [[TMP78]], [[TMP80]] 103; CHECK-NEXT: br label [[UDIV_END]] 104; CHECK: udiv-do-while: 105; CHECK-NEXT: [[TMP82:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER:%.*]] ], [ [[TMP93]], [[UDIV_DO_WHILE]] ] 106; CHECK-NEXT: [[TMP83:%.*]] = phi i129 [ [[TMP100:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP96:%.*]], [[UDIV_DO_WHILE]] ] 107; CHECK-NEXT: [[TMP84:%.*]] = phi i129 [ [[TMP98:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP95:%.*]], [[UDIV_DO_WHILE]] ] 108; CHECK-NEXT: [[TMP85:%.*]] = phi i129 [ [[TMP102]], [[UDIV_PREHEADER]] ], [ [[TMP90]], [[UDIV_DO_WHILE]] ] 109; CHECK-NEXT: [[TMP86:%.*]] = shl i129 [[TMP84]], 1 110; CHECK-NEXT: [[TMP87:%.*]] = lshr i129 [[TMP85]], 128 111; CHECK-NEXT: [[TMP88:%.*]] = or i129 [[TMP86]], [[TMP87]] 112; CHECK-NEXT: [[TMP89:%.*]] = shl i129 [[TMP85]], 1 113; CHECK-NEXT: [[TMP90]] = or i129 [[TMP82]], [[TMP89]] 114; CHECK-NEXT: [[TMP91:%.*]] = sub i129 [[TMP99:%.*]], [[TMP88]] 115; CHECK-NEXT: [[TMP92:%.*]] = ashr i129 [[TMP91]], 128 116; CHECK-NEXT: [[TMP93]] = and i129 [[TMP92]], 1 117; CHECK-NEXT: [[TMP94:%.*]] = and i129 [[TMP92]], [[TMP65]] 118; CHECK-NEXT: [[TMP95]] = sub i129 [[TMP88]], [[TMP94]] 119; CHECK-NEXT: [[TMP96]] = add i129 [[TMP83]], -1 120; CHECK-NEXT: [[TMP97:%.*]] = icmp eq i129 [[TMP96]], 0 121; CHECK-NEXT: br i1 [[TMP97]], label [[UDIV_LOOP_EXIT:%.*]], label [[UDIV_DO_WHILE]] 122; CHECK: udiv-preheader: 123; CHECK-NEXT: [[TMP98]] = lshr i129 [[TMP66]], [[TMP100]] 124; CHECK-NEXT: [[TMP99]] = add i129 [[TMP65]], -1 125; CHECK-NEXT: br label [[UDIV_DO_WHILE]] 126; CHECK: udiv-bb1: 127; CHECK-NEXT: [[TMP100]] = add i129 [[TMP72]], 1 128; CHECK-NEXT: [[TMP101:%.*]] = sub i129 128, [[TMP72]] 129; CHECK-NEXT: [[TMP102]] = shl i129 [[TMP66]], [[TMP101]] 130; CHECK-NEXT: [[TMP103:%.*]] = icmp eq i129 [[TMP100]], 0 131; CHECK-NEXT: br i1 [[TMP103]], label [[UDIV_LOOP_EXIT]], label [[UDIV_PREHEADER]] 132; CHECK: udiv-end: 133; CHECK-NEXT: [[TMP104:%.*]] = phi i129 [ [[TMP81]], [[UDIV_LOOP_EXIT]] ], [ [[TMP76]], [[UDIV_END1]] ] 134; CHECK-NEXT: [[TMP105:%.*]] = xor i129 [[TMP104]], [[TMP64]] 135; CHECK-NEXT: [[TMP106:%.*]] = sub i129 [[TMP105]], [[TMP64]] 136; CHECK-NEXT: [[TMP107:%.*]] = insertelement <2 x i129> [[TMP53]], i129 [[TMP106]], i64 1 137; CHECK-NEXT: ret <2 x i129> [[TMP107]] 138; 139 %res = sdiv <2 x i129> %a, %b 140 ret <2 x i129> %res 141} 142 143define <2 x i129> @udiv129(<2 x i129> %a, <2 x i129> %b) nounwind { 144; CHECK-LABEL: define <2 x i129> @udiv129( 145; CHECK-SAME: <2 x i129> [[A:%.*]], <2 x i129> [[B:%.*]]) #[[ATTR0]] { 146; CHECK-NEXT: _udiv-special-cases_udiv-special-cases: 147; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i129> [[A]], i64 0 148; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i129> [[B]], i64 0 149; CHECK-NEXT: [[TMP2:%.*]] = freeze i129 [[TMP1]] 150; CHECK-NEXT: [[TMP3:%.*]] = freeze i129 [[TMP0]] 151; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i129 [[TMP2]], 0 152; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i129 [[TMP3]], 0 153; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]] 154; CHECK-NEXT: [[TMP7:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP2]], i1 true) 155; CHECK-NEXT: [[TMP8:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP3]], i1 true) 156; CHECK-NEXT: [[TMP9:%.*]] = sub i129 [[TMP7]], [[TMP8]] 157; CHECK-NEXT: [[TMP10:%.*]] = icmp ugt i129 [[TMP9]], 128 158; CHECK-NEXT: [[TMP11:%.*]] = select i1 [[TMP6]], i1 true, i1 [[TMP10]] 159; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i129 [[TMP9]], 128 160; CHECK-NEXT: [[TMP13:%.*]] = select i1 [[TMP11]], i129 0, i129 [[TMP3]] 161; CHECK-NEXT: [[TMP14:%.*]] = select i1 [[TMP11]], i1 true, i1 [[TMP12]] 162; CHECK-NEXT: br i1 [[TMP14]], label [[UDIV_END1:%.*]], label [[UDIV_BB15:%.*]] 163; CHECK: udiv-loop-exit2: 164; CHECK-NEXT: [[TMP15:%.*]] = phi i129 [ 0, [[UDIV_BB15]] ], [ [[TMP30:%.*]], [[UDIV_DO_WHILE3:%.*]] ] 165; CHECK-NEXT: [[TMP16:%.*]] = phi i129 [ [[TMP39:%.*]], [[UDIV_BB15]] ], [ [[TMP27:%.*]], [[UDIV_DO_WHILE3]] ] 166; CHECK-NEXT: [[TMP17:%.*]] = shl i129 [[TMP16]], 1 167; CHECK-NEXT: [[TMP18:%.*]] = or i129 [[TMP15]], [[TMP17]] 168; CHECK-NEXT: br label [[UDIV_END1]] 169; CHECK: udiv-do-while3: 170; CHECK-NEXT: [[TMP19:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER4:%.*]] ], [ [[TMP30]], [[UDIV_DO_WHILE3]] ] 171; CHECK-NEXT: [[TMP20:%.*]] = phi i129 [ [[TMP37:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP33:%.*]], [[UDIV_DO_WHILE3]] ] 172; CHECK-NEXT: [[TMP21:%.*]] = phi i129 [ [[TMP35:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP32:%.*]], [[UDIV_DO_WHILE3]] ] 173; CHECK-NEXT: [[TMP22:%.*]] = phi i129 [ [[TMP39]], [[UDIV_PREHEADER4]] ], [ [[TMP27]], [[UDIV_DO_WHILE3]] ] 174; CHECK-NEXT: [[TMP23:%.*]] = shl i129 [[TMP21]], 1 175; CHECK-NEXT: [[TMP24:%.*]] = lshr i129 [[TMP22]], 128 176; CHECK-NEXT: [[TMP25:%.*]] = or i129 [[TMP23]], [[TMP24]] 177; CHECK-NEXT: [[TMP26:%.*]] = shl i129 [[TMP22]], 1 178; CHECK-NEXT: [[TMP27]] = or i129 [[TMP19]], [[TMP26]] 179; CHECK-NEXT: [[TMP28:%.*]] = sub i129 [[TMP36:%.*]], [[TMP25]] 180; CHECK-NEXT: [[TMP29:%.*]] = ashr i129 [[TMP28]], 128 181; CHECK-NEXT: [[TMP30]] = and i129 [[TMP29]], 1 182; CHECK-NEXT: [[TMP31:%.*]] = and i129 [[TMP29]], [[TMP2]] 183; CHECK-NEXT: [[TMP32]] = sub i129 [[TMP25]], [[TMP31]] 184; CHECK-NEXT: [[TMP33]] = add i129 [[TMP20]], -1 185; CHECK-NEXT: [[TMP34:%.*]] = icmp eq i129 [[TMP33]], 0 186; CHECK-NEXT: br i1 [[TMP34]], label [[UDIV_LOOP_EXIT2:%.*]], label [[UDIV_DO_WHILE3]] 187; CHECK: udiv-preheader4: 188; CHECK-NEXT: [[TMP35]] = lshr i129 [[TMP3]], [[TMP37]] 189; CHECK-NEXT: [[TMP36]] = add i129 [[TMP2]], -1 190; CHECK-NEXT: br label [[UDIV_DO_WHILE3]] 191; CHECK: udiv-bb15: 192; CHECK-NEXT: [[TMP37]] = add i129 [[TMP9]], 1 193; CHECK-NEXT: [[TMP38:%.*]] = sub i129 128, [[TMP9]] 194; CHECK-NEXT: [[TMP39]] = shl i129 [[TMP3]], [[TMP38]] 195; CHECK-NEXT: [[TMP40:%.*]] = icmp eq i129 [[TMP37]], 0 196; CHECK-NEXT: br i1 [[TMP40]], label [[UDIV_LOOP_EXIT2]], label [[UDIV_PREHEADER4]] 197; CHECK: udiv-end1: 198; CHECK-NEXT: [[TMP41:%.*]] = phi i129 [ [[TMP18]], [[UDIV_LOOP_EXIT2]] ], [ [[TMP13]], [[_UDIV_SPECIAL_CASES_UDIV_SPECIAL_CASES:%.*]] ] 199; CHECK-NEXT: [[TMP42:%.*]] = insertelement <2 x i129> poison, i129 [[TMP41]], i64 0 200; CHECK-NEXT: [[TMP43:%.*]] = extractelement <2 x i129> [[A]], i64 1 201; CHECK-NEXT: [[TMP44:%.*]] = extractelement <2 x i129> [[B]], i64 1 202; CHECK-NEXT: [[TMP45:%.*]] = freeze i129 [[TMP44]] 203; CHECK-NEXT: [[TMP46:%.*]] = freeze i129 [[TMP43]] 204; CHECK-NEXT: [[TMP47:%.*]] = icmp eq i129 [[TMP45]], 0 205; CHECK-NEXT: [[TMP48:%.*]] = icmp eq i129 [[TMP46]], 0 206; CHECK-NEXT: [[TMP49:%.*]] = or i1 [[TMP47]], [[TMP48]] 207; CHECK-NEXT: [[TMP50:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP45]], i1 true) 208; CHECK-NEXT: [[TMP51:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP46]], i1 true) 209; CHECK-NEXT: [[TMP52:%.*]] = sub i129 [[TMP50]], [[TMP51]] 210; CHECK-NEXT: [[TMP53:%.*]] = icmp ugt i129 [[TMP52]], 128 211; CHECK-NEXT: [[TMP54:%.*]] = select i1 [[TMP49]], i1 true, i1 [[TMP53]] 212; CHECK-NEXT: [[TMP55:%.*]] = icmp eq i129 [[TMP52]], 128 213; CHECK-NEXT: [[TMP56:%.*]] = select i1 [[TMP54]], i129 0, i129 [[TMP46]] 214; CHECK-NEXT: [[TMP57:%.*]] = select i1 [[TMP54]], i1 true, i1 [[TMP55]] 215; CHECK-NEXT: br i1 [[TMP57]], label [[UDIV_END:%.*]], label [[UDIV_BB1:%.*]] 216; CHECK: udiv-loop-exit: 217; CHECK-NEXT: [[TMP58:%.*]] = phi i129 [ 0, [[UDIV_BB1]] ], [ [[TMP73:%.*]], [[UDIV_DO_WHILE:%.*]] ] 218; CHECK-NEXT: [[TMP59:%.*]] = phi i129 [ [[TMP82:%.*]], [[UDIV_BB1]] ], [ [[TMP70:%.*]], [[UDIV_DO_WHILE]] ] 219; CHECK-NEXT: [[TMP60:%.*]] = shl i129 [[TMP59]], 1 220; CHECK-NEXT: [[TMP61:%.*]] = or i129 [[TMP58]], [[TMP60]] 221; CHECK-NEXT: br label [[UDIV_END]] 222; CHECK: udiv-do-while: 223; CHECK-NEXT: [[TMP62:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER:%.*]] ], [ [[TMP73]], [[UDIV_DO_WHILE]] ] 224; CHECK-NEXT: [[TMP63:%.*]] = phi i129 [ [[TMP80:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP76:%.*]], [[UDIV_DO_WHILE]] ] 225; CHECK-NEXT: [[TMP64:%.*]] = phi i129 [ [[TMP78:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP75:%.*]], [[UDIV_DO_WHILE]] ] 226; CHECK-NEXT: [[TMP65:%.*]] = phi i129 [ [[TMP82]], [[UDIV_PREHEADER]] ], [ [[TMP70]], [[UDIV_DO_WHILE]] ] 227; CHECK-NEXT: [[TMP66:%.*]] = shl i129 [[TMP64]], 1 228; CHECK-NEXT: [[TMP67:%.*]] = lshr i129 [[TMP65]], 128 229; CHECK-NEXT: [[TMP68:%.*]] = or i129 [[TMP66]], [[TMP67]] 230; CHECK-NEXT: [[TMP69:%.*]] = shl i129 [[TMP65]], 1 231; CHECK-NEXT: [[TMP70]] = or i129 [[TMP62]], [[TMP69]] 232; CHECK-NEXT: [[TMP71:%.*]] = sub i129 [[TMP79:%.*]], [[TMP68]] 233; CHECK-NEXT: [[TMP72:%.*]] = ashr i129 [[TMP71]], 128 234; CHECK-NEXT: [[TMP73]] = and i129 [[TMP72]], 1 235; CHECK-NEXT: [[TMP74:%.*]] = and i129 [[TMP72]], [[TMP45]] 236; CHECK-NEXT: [[TMP75]] = sub i129 [[TMP68]], [[TMP74]] 237; CHECK-NEXT: [[TMP76]] = add i129 [[TMP63]], -1 238; CHECK-NEXT: [[TMP77:%.*]] = icmp eq i129 [[TMP76]], 0 239; CHECK-NEXT: br i1 [[TMP77]], label [[UDIV_LOOP_EXIT:%.*]], label [[UDIV_DO_WHILE]] 240; CHECK: udiv-preheader: 241; CHECK-NEXT: [[TMP78]] = lshr i129 [[TMP46]], [[TMP80]] 242; CHECK-NEXT: [[TMP79]] = add i129 [[TMP45]], -1 243; CHECK-NEXT: br label [[UDIV_DO_WHILE]] 244; CHECK: udiv-bb1: 245; CHECK-NEXT: [[TMP80]] = add i129 [[TMP52]], 1 246; CHECK-NEXT: [[TMP81:%.*]] = sub i129 128, [[TMP52]] 247; CHECK-NEXT: [[TMP82]] = shl i129 [[TMP46]], [[TMP81]] 248; CHECK-NEXT: [[TMP83:%.*]] = icmp eq i129 [[TMP80]], 0 249; CHECK-NEXT: br i1 [[TMP83]], label [[UDIV_LOOP_EXIT]], label [[UDIV_PREHEADER]] 250; CHECK: udiv-end: 251; CHECK-NEXT: [[TMP84:%.*]] = phi i129 [ [[TMP61]], [[UDIV_LOOP_EXIT]] ], [ [[TMP56]], [[UDIV_END1]] ] 252; CHECK-NEXT: [[TMP85:%.*]] = insertelement <2 x i129> [[TMP42]], i129 [[TMP84]], i64 1 253; CHECK-NEXT: ret <2 x i129> [[TMP85]] 254; 255 %res = udiv <2 x i129> %a, %b 256 ret <2 x i129> %res 257} 258 259define <2 x i129> @srem129(<2 x i129> %a, <2 x i129> %b) nounwind { 260; CHECK-LABEL: define <2 x i129> @srem129( 261; CHECK-SAME: <2 x i129> [[A:%.*]], <2 x i129> [[B:%.*]]) #[[ATTR0]] { 262; CHECK-NEXT: _udiv-special-cases_udiv-special-cases: 263; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i129> [[A]], i64 0 264; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i129> [[B]], i64 0 265; CHECK-NEXT: [[TMP2:%.*]] = freeze i129 [[TMP0]] 266; CHECK-NEXT: [[TMP3:%.*]] = freeze i129 [[TMP1]] 267; CHECK-NEXT: [[TMP4:%.*]] = ashr i129 [[TMP2]], 128 268; CHECK-NEXT: [[TMP5:%.*]] = ashr i129 [[TMP3]], 128 269; CHECK-NEXT: [[TMP6:%.*]] = xor i129 [[TMP2]], [[TMP4]] 270; CHECK-NEXT: [[TMP7:%.*]] = xor i129 [[TMP3]], [[TMP5]] 271; CHECK-NEXT: [[TMP8:%.*]] = sub i129 [[TMP6]], [[TMP4]] 272; CHECK-NEXT: [[TMP9:%.*]] = sub i129 [[TMP7]], [[TMP5]] 273; CHECK-NEXT: [[TMP10:%.*]] = freeze i129 [[TMP8]] 274; CHECK-NEXT: [[TMP11:%.*]] = freeze i129 [[TMP9]] 275; CHECK-NEXT: [[TMP12:%.*]] = freeze i129 [[TMP11]] 276; CHECK-NEXT: [[TMP13:%.*]] = freeze i129 [[TMP10]] 277; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i129 [[TMP12]], 0 278; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i129 [[TMP13]], 0 279; CHECK-NEXT: [[TMP16:%.*]] = or i1 [[TMP14]], [[TMP15]] 280; CHECK-NEXT: [[TMP17:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP12]], i1 true) 281; CHECK-NEXT: [[TMP18:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP13]], i1 true) 282; CHECK-NEXT: [[TMP19:%.*]] = sub i129 [[TMP17]], [[TMP18]] 283; CHECK-NEXT: [[TMP20:%.*]] = icmp ugt i129 [[TMP19]], 128 284; CHECK-NEXT: [[TMP21:%.*]] = select i1 [[TMP16]], i1 true, i1 [[TMP20]] 285; CHECK-NEXT: [[TMP22:%.*]] = icmp eq i129 [[TMP19]], 128 286; CHECK-NEXT: [[TMP23:%.*]] = select i1 [[TMP21]], i129 0, i129 [[TMP13]] 287; CHECK-NEXT: [[TMP24:%.*]] = select i1 [[TMP21]], i1 true, i1 [[TMP22]] 288; CHECK-NEXT: br i1 [[TMP24]], label [[UDIV_END1:%.*]], label [[UDIV_BB15:%.*]] 289; CHECK: udiv-loop-exit2: 290; CHECK-NEXT: [[TMP25:%.*]] = phi i129 [ 0, [[UDIV_BB15]] ], [ [[TMP40:%.*]], [[UDIV_DO_WHILE3:%.*]] ] 291; CHECK-NEXT: [[TMP26:%.*]] = phi i129 [ [[TMP49:%.*]], [[UDIV_BB15]] ], [ [[TMP37:%.*]], [[UDIV_DO_WHILE3]] ] 292; CHECK-NEXT: [[TMP27:%.*]] = shl i129 [[TMP26]], 1 293; CHECK-NEXT: [[TMP28:%.*]] = or i129 [[TMP25]], [[TMP27]] 294; CHECK-NEXT: br label [[UDIV_END1]] 295; CHECK: udiv-do-while3: 296; CHECK-NEXT: [[TMP29:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER4:%.*]] ], [ [[TMP40]], [[UDIV_DO_WHILE3]] ] 297; CHECK-NEXT: [[TMP30:%.*]] = phi i129 [ [[TMP47:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP43:%.*]], [[UDIV_DO_WHILE3]] ] 298; CHECK-NEXT: [[TMP31:%.*]] = phi i129 [ [[TMP45:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP42:%.*]], [[UDIV_DO_WHILE3]] ] 299; CHECK-NEXT: [[TMP32:%.*]] = phi i129 [ [[TMP49]], [[UDIV_PREHEADER4]] ], [ [[TMP37]], [[UDIV_DO_WHILE3]] ] 300; CHECK-NEXT: [[TMP33:%.*]] = shl i129 [[TMP31]], 1 301; CHECK-NEXT: [[TMP34:%.*]] = lshr i129 [[TMP32]], 128 302; CHECK-NEXT: [[TMP35:%.*]] = or i129 [[TMP33]], [[TMP34]] 303; CHECK-NEXT: [[TMP36:%.*]] = shl i129 [[TMP32]], 1 304; CHECK-NEXT: [[TMP37]] = or i129 [[TMP29]], [[TMP36]] 305; CHECK-NEXT: [[TMP38:%.*]] = sub i129 [[TMP46:%.*]], [[TMP35]] 306; CHECK-NEXT: [[TMP39:%.*]] = ashr i129 [[TMP38]], 128 307; CHECK-NEXT: [[TMP40]] = and i129 [[TMP39]], 1 308; CHECK-NEXT: [[TMP41:%.*]] = and i129 [[TMP39]], [[TMP12]] 309; CHECK-NEXT: [[TMP42]] = sub i129 [[TMP35]], [[TMP41]] 310; CHECK-NEXT: [[TMP43]] = add i129 [[TMP30]], -1 311; CHECK-NEXT: [[TMP44:%.*]] = icmp eq i129 [[TMP43]], 0 312; CHECK-NEXT: br i1 [[TMP44]], label [[UDIV_LOOP_EXIT2:%.*]], label [[UDIV_DO_WHILE3]] 313; CHECK: udiv-preheader4: 314; CHECK-NEXT: [[TMP45]] = lshr i129 [[TMP13]], [[TMP47]] 315; CHECK-NEXT: [[TMP46]] = add i129 [[TMP12]], -1 316; CHECK-NEXT: br label [[UDIV_DO_WHILE3]] 317; CHECK: udiv-bb15: 318; CHECK-NEXT: [[TMP47]] = add i129 [[TMP19]], 1 319; CHECK-NEXT: [[TMP48:%.*]] = sub i129 128, [[TMP19]] 320; CHECK-NEXT: [[TMP49]] = shl i129 [[TMP13]], [[TMP48]] 321; CHECK-NEXT: [[TMP50:%.*]] = icmp eq i129 [[TMP47]], 0 322; CHECK-NEXT: br i1 [[TMP50]], label [[UDIV_LOOP_EXIT2]], label [[UDIV_PREHEADER4]] 323; CHECK: udiv-end1: 324; CHECK-NEXT: [[TMP51:%.*]] = phi i129 [ [[TMP28]], [[UDIV_LOOP_EXIT2]] ], [ [[TMP23]], [[_UDIV_SPECIAL_CASES_UDIV_SPECIAL_CASES:%.*]] ] 325; CHECK-NEXT: [[TMP52:%.*]] = mul i129 [[TMP11]], [[TMP51]] 326; CHECK-NEXT: [[TMP53:%.*]] = sub i129 [[TMP10]], [[TMP52]] 327; CHECK-NEXT: [[TMP54:%.*]] = xor i129 [[TMP53]], [[TMP4]] 328; CHECK-NEXT: [[TMP55:%.*]] = sub i129 [[TMP54]], [[TMP4]] 329; CHECK-NEXT: [[TMP56:%.*]] = insertelement <2 x i129> poison, i129 [[TMP55]], i64 0 330; CHECK-NEXT: [[TMP57:%.*]] = extractelement <2 x i129> [[A]], i64 1 331; CHECK-NEXT: [[TMP58:%.*]] = extractelement <2 x i129> [[B]], i64 1 332; CHECK-NEXT: [[TMP59:%.*]] = freeze i129 [[TMP57]] 333; CHECK-NEXT: [[TMP60:%.*]] = freeze i129 [[TMP58]] 334; CHECK-NEXT: [[TMP61:%.*]] = ashr i129 [[TMP59]], 128 335; CHECK-NEXT: [[TMP62:%.*]] = ashr i129 [[TMP60]], 128 336; CHECK-NEXT: [[TMP63:%.*]] = xor i129 [[TMP59]], [[TMP61]] 337; CHECK-NEXT: [[TMP64:%.*]] = xor i129 [[TMP60]], [[TMP62]] 338; CHECK-NEXT: [[TMP65:%.*]] = sub i129 [[TMP63]], [[TMP61]] 339; CHECK-NEXT: [[TMP66:%.*]] = sub i129 [[TMP64]], [[TMP62]] 340; CHECK-NEXT: [[TMP67:%.*]] = freeze i129 [[TMP65]] 341; CHECK-NEXT: [[TMP68:%.*]] = freeze i129 [[TMP66]] 342; CHECK-NEXT: [[TMP69:%.*]] = freeze i129 [[TMP68]] 343; CHECK-NEXT: [[TMP70:%.*]] = freeze i129 [[TMP67]] 344; CHECK-NEXT: [[TMP71:%.*]] = icmp eq i129 [[TMP69]], 0 345; CHECK-NEXT: [[TMP72:%.*]] = icmp eq i129 [[TMP70]], 0 346; CHECK-NEXT: [[TMP73:%.*]] = or i1 [[TMP71]], [[TMP72]] 347; CHECK-NEXT: [[TMP74:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP69]], i1 true) 348; CHECK-NEXT: [[TMP75:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP70]], i1 true) 349; CHECK-NEXT: [[TMP76:%.*]] = sub i129 [[TMP74]], [[TMP75]] 350; CHECK-NEXT: [[TMP77:%.*]] = icmp ugt i129 [[TMP76]], 128 351; CHECK-NEXT: [[TMP78:%.*]] = select i1 [[TMP73]], i1 true, i1 [[TMP77]] 352; CHECK-NEXT: [[TMP79:%.*]] = icmp eq i129 [[TMP76]], 128 353; CHECK-NEXT: [[TMP80:%.*]] = select i1 [[TMP78]], i129 0, i129 [[TMP70]] 354; CHECK-NEXT: [[TMP81:%.*]] = select i1 [[TMP78]], i1 true, i1 [[TMP79]] 355; CHECK-NEXT: br i1 [[TMP81]], label [[UDIV_END:%.*]], label [[UDIV_BB1:%.*]] 356; CHECK: udiv-loop-exit: 357; CHECK-NEXT: [[TMP82:%.*]] = phi i129 [ 0, [[UDIV_BB1]] ], [ [[TMP97:%.*]], [[UDIV_DO_WHILE:%.*]] ] 358; CHECK-NEXT: [[TMP83:%.*]] = phi i129 [ [[TMP106:%.*]], [[UDIV_BB1]] ], [ [[TMP94:%.*]], [[UDIV_DO_WHILE]] ] 359; CHECK-NEXT: [[TMP84:%.*]] = shl i129 [[TMP83]], 1 360; CHECK-NEXT: [[TMP85:%.*]] = or i129 [[TMP82]], [[TMP84]] 361; CHECK-NEXT: br label [[UDIV_END]] 362; CHECK: udiv-do-while: 363; CHECK-NEXT: [[TMP86:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER:%.*]] ], [ [[TMP97]], [[UDIV_DO_WHILE]] ] 364; CHECK-NEXT: [[TMP87:%.*]] = phi i129 [ [[TMP104:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP100:%.*]], [[UDIV_DO_WHILE]] ] 365; CHECK-NEXT: [[TMP88:%.*]] = phi i129 [ [[TMP102:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP99:%.*]], [[UDIV_DO_WHILE]] ] 366; CHECK-NEXT: [[TMP89:%.*]] = phi i129 [ [[TMP106]], [[UDIV_PREHEADER]] ], [ [[TMP94]], [[UDIV_DO_WHILE]] ] 367; CHECK-NEXT: [[TMP90:%.*]] = shl i129 [[TMP88]], 1 368; CHECK-NEXT: [[TMP91:%.*]] = lshr i129 [[TMP89]], 128 369; CHECK-NEXT: [[TMP92:%.*]] = or i129 [[TMP90]], [[TMP91]] 370; CHECK-NEXT: [[TMP93:%.*]] = shl i129 [[TMP89]], 1 371; CHECK-NEXT: [[TMP94]] = or i129 [[TMP86]], [[TMP93]] 372; CHECK-NEXT: [[TMP95:%.*]] = sub i129 [[TMP103:%.*]], [[TMP92]] 373; CHECK-NEXT: [[TMP96:%.*]] = ashr i129 [[TMP95]], 128 374; CHECK-NEXT: [[TMP97]] = and i129 [[TMP96]], 1 375; CHECK-NEXT: [[TMP98:%.*]] = and i129 [[TMP96]], [[TMP69]] 376; CHECK-NEXT: [[TMP99]] = sub i129 [[TMP92]], [[TMP98]] 377; CHECK-NEXT: [[TMP100]] = add i129 [[TMP87]], -1 378; CHECK-NEXT: [[TMP101:%.*]] = icmp eq i129 [[TMP100]], 0 379; CHECK-NEXT: br i1 [[TMP101]], label [[UDIV_LOOP_EXIT:%.*]], label [[UDIV_DO_WHILE]] 380; CHECK: udiv-preheader: 381; CHECK-NEXT: [[TMP102]] = lshr i129 [[TMP70]], [[TMP104]] 382; CHECK-NEXT: [[TMP103]] = add i129 [[TMP69]], -1 383; CHECK-NEXT: br label [[UDIV_DO_WHILE]] 384; CHECK: udiv-bb1: 385; CHECK-NEXT: [[TMP104]] = add i129 [[TMP76]], 1 386; CHECK-NEXT: [[TMP105:%.*]] = sub i129 128, [[TMP76]] 387; CHECK-NEXT: [[TMP106]] = shl i129 [[TMP70]], [[TMP105]] 388; CHECK-NEXT: [[TMP107:%.*]] = icmp eq i129 [[TMP104]], 0 389; CHECK-NEXT: br i1 [[TMP107]], label [[UDIV_LOOP_EXIT]], label [[UDIV_PREHEADER]] 390; CHECK: udiv-end: 391; CHECK-NEXT: [[TMP108:%.*]] = phi i129 [ [[TMP85]], [[UDIV_LOOP_EXIT]] ], [ [[TMP80]], [[UDIV_END1]] ] 392; CHECK-NEXT: [[TMP109:%.*]] = mul i129 [[TMP68]], [[TMP108]] 393; CHECK-NEXT: [[TMP110:%.*]] = sub i129 [[TMP67]], [[TMP109]] 394; CHECK-NEXT: [[TMP111:%.*]] = xor i129 [[TMP110]], [[TMP61]] 395; CHECK-NEXT: [[TMP112:%.*]] = sub i129 [[TMP111]], [[TMP61]] 396; CHECK-NEXT: [[TMP113:%.*]] = insertelement <2 x i129> [[TMP56]], i129 [[TMP112]], i64 1 397; CHECK-NEXT: ret <2 x i129> [[TMP113]] 398; 399 %res = srem <2 x i129> %a, %b 400 ret <2 x i129> %res 401} 402 403define <2 x i129> @urem129(<2 x i129> %a, <2 x i129> %b) nounwind { 404; CHECK-LABEL: define <2 x i129> @urem129( 405; CHECK-SAME: <2 x i129> [[A:%.*]], <2 x i129> [[B:%.*]]) #[[ATTR0]] { 406; CHECK-NEXT: _udiv-special-cases_udiv-special-cases: 407; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i129> [[A]], i64 0 408; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i129> [[B]], i64 0 409; CHECK-NEXT: [[TMP2:%.*]] = freeze i129 [[TMP0]] 410; CHECK-NEXT: [[TMP3:%.*]] = freeze i129 [[TMP1]] 411; CHECK-NEXT: [[TMP4:%.*]] = freeze i129 [[TMP3]] 412; CHECK-NEXT: [[TMP5:%.*]] = freeze i129 [[TMP2]] 413; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i129 [[TMP4]], 0 414; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i129 [[TMP5]], 0 415; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]] 416; CHECK-NEXT: [[TMP9:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP4]], i1 true) 417; CHECK-NEXT: [[TMP10:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP5]], i1 true) 418; CHECK-NEXT: [[TMP11:%.*]] = sub i129 [[TMP9]], [[TMP10]] 419; CHECK-NEXT: [[TMP12:%.*]] = icmp ugt i129 [[TMP11]], 128 420; CHECK-NEXT: [[TMP13:%.*]] = select i1 [[TMP8]], i1 true, i1 [[TMP12]] 421; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i129 [[TMP11]], 128 422; CHECK-NEXT: [[TMP15:%.*]] = select i1 [[TMP13]], i129 0, i129 [[TMP5]] 423; CHECK-NEXT: [[TMP16:%.*]] = select i1 [[TMP13]], i1 true, i1 [[TMP14]] 424; CHECK-NEXT: br i1 [[TMP16]], label [[UDIV_END1:%.*]], label [[UDIV_BB15:%.*]] 425; CHECK: udiv-loop-exit2: 426; CHECK-NEXT: [[TMP17:%.*]] = phi i129 [ 0, [[UDIV_BB15]] ], [ [[TMP32:%.*]], [[UDIV_DO_WHILE3:%.*]] ] 427; CHECK-NEXT: [[TMP18:%.*]] = phi i129 [ [[TMP41:%.*]], [[UDIV_BB15]] ], [ [[TMP29:%.*]], [[UDIV_DO_WHILE3]] ] 428; CHECK-NEXT: [[TMP19:%.*]] = shl i129 [[TMP18]], 1 429; CHECK-NEXT: [[TMP20:%.*]] = or i129 [[TMP17]], [[TMP19]] 430; CHECK-NEXT: br label [[UDIV_END1]] 431; CHECK: udiv-do-while3: 432; CHECK-NEXT: [[TMP21:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER4:%.*]] ], [ [[TMP32]], [[UDIV_DO_WHILE3]] ] 433; CHECK-NEXT: [[TMP22:%.*]] = phi i129 [ [[TMP39:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP35:%.*]], [[UDIV_DO_WHILE3]] ] 434; CHECK-NEXT: [[TMP23:%.*]] = phi i129 [ [[TMP37:%.*]], [[UDIV_PREHEADER4]] ], [ [[TMP34:%.*]], [[UDIV_DO_WHILE3]] ] 435; CHECK-NEXT: [[TMP24:%.*]] = phi i129 [ [[TMP41]], [[UDIV_PREHEADER4]] ], [ [[TMP29]], [[UDIV_DO_WHILE3]] ] 436; CHECK-NEXT: [[TMP25:%.*]] = shl i129 [[TMP23]], 1 437; CHECK-NEXT: [[TMP26:%.*]] = lshr i129 [[TMP24]], 128 438; CHECK-NEXT: [[TMP27:%.*]] = or i129 [[TMP25]], [[TMP26]] 439; CHECK-NEXT: [[TMP28:%.*]] = shl i129 [[TMP24]], 1 440; CHECK-NEXT: [[TMP29]] = or i129 [[TMP21]], [[TMP28]] 441; CHECK-NEXT: [[TMP30:%.*]] = sub i129 [[TMP38:%.*]], [[TMP27]] 442; CHECK-NEXT: [[TMP31:%.*]] = ashr i129 [[TMP30]], 128 443; CHECK-NEXT: [[TMP32]] = and i129 [[TMP31]], 1 444; CHECK-NEXT: [[TMP33:%.*]] = and i129 [[TMP31]], [[TMP4]] 445; CHECK-NEXT: [[TMP34]] = sub i129 [[TMP27]], [[TMP33]] 446; CHECK-NEXT: [[TMP35]] = add i129 [[TMP22]], -1 447; CHECK-NEXT: [[TMP36:%.*]] = icmp eq i129 [[TMP35]], 0 448; CHECK-NEXT: br i1 [[TMP36]], label [[UDIV_LOOP_EXIT2:%.*]], label [[UDIV_DO_WHILE3]] 449; CHECK: udiv-preheader4: 450; CHECK-NEXT: [[TMP37]] = lshr i129 [[TMP5]], [[TMP39]] 451; CHECK-NEXT: [[TMP38]] = add i129 [[TMP4]], -1 452; CHECK-NEXT: br label [[UDIV_DO_WHILE3]] 453; CHECK: udiv-bb15: 454; CHECK-NEXT: [[TMP39]] = add i129 [[TMP11]], 1 455; CHECK-NEXT: [[TMP40:%.*]] = sub i129 128, [[TMP11]] 456; CHECK-NEXT: [[TMP41]] = shl i129 [[TMP5]], [[TMP40]] 457; CHECK-NEXT: [[TMP42:%.*]] = icmp eq i129 [[TMP39]], 0 458; CHECK-NEXT: br i1 [[TMP42]], label [[UDIV_LOOP_EXIT2]], label [[UDIV_PREHEADER4]] 459; CHECK: udiv-end1: 460; CHECK-NEXT: [[TMP43:%.*]] = phi i129 [ [[TMP20]], [[UDIV_LOOP_EXIT2]] ], [ [[TMP15]], [[_UDIV_SPECIAL_CASES_UDIV_SPECIAL_CASES:%.*]] ] 461; CHECK-NEXT: [[TMP44:%.*]] = mul i129 [[TMP3]], [[TMP43]] 462; CHECK-NEXT: [[TMP45:%.*]] = sub i129 [[TMP2]], [[TMP44]] 463; CHECK-NEXT: [[TMP46:%.*]] = insertelement <2 x i129> poison, i129 [[TMP45]], i64 0 464; CHECK-NEXT: [[TMP47:%.*]] = extractelement <2 x i129> [[A]], i64 1 465; CHECK-NEXT: [[TMP48:%.*]] = extractelement <2 x i129> [[B]], i64 1 466; CHECK-NEXT: [[TMP49:%.*]] = freeze i129 [[TMP47]] 467; CHECK-NEXT: [[TMP50:%.*]] = freeze i129 [[TMP48]] 468; CHECK-NEXT: [[TMP51:%.*]] = freeze i129 [[TMP50]] 469; CHECK-NEXT: [[TMP52:%.*]] = freeze i129 [[TMP49]] 470; CHECK-NEXT: [[TMP53:%.*]] = icmp eq i129 [[TMP51]], 0 471; CHECK-NEXT: [[TMP54:%.*]] = icmp eq i129 [[TMP52]], 0 472; CHECK-NEXT: [[TMP55:%.*]] = or i1 [[TMP53]], [[TMP54]] 473; CHECK-NEXT: [[TMP56:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP51]], i1 true) 474; CHECK-NEXT: [[TMP57:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP52]], i1 true) 475; CHECK-NEXT: [[TMP58:%.*]] = sub i129 [[TMP56]], [[TMP57]] 476; CHECK-NEXT: [[TMP59:%.*]] = icmp ugt i129 [[TMP58]], 128 477; CHECK-NEXT: [[TMP60:%.*]] = select i1 [[TMP55]], i1 true, i1 [[TMP59]] 478; CHECK-NEXT: [[TMP61:%.*]] = icmp eq i129 [[TMP58]], 128 479; CHECK-NEXT: [[TMP62:%.*]] = select i1 [[TMP60]], i129 0, i129 [[TMP52]] 480; CHECK-NEXT: [[TMP63:%.*]] = select i1 [[TMP60]], i1 true, i1 [[TMP61]] 481; CHECK-NEXT: br i1 [[TMP63]], label [[UDIV_END:%.*]], label [[UDIV_BB1:%.*]] 482; CHECK: udiv-loop-exit: 483; CHECK-NEXT: [[TMP64:%.*]] = phi i129 [ 0, [[UDIV_BB1]] ], [ [[TMP79:%.*]], [[UDIV_DO_WHILE:%.*]] ] 484; CHECK-NEXT: [[TMP65:%.*]] = phi i129 [ [[TMP88:%.*]], [[UDIV_BB1]] ], [ [[TMP76:%.*]], [[UDIV_DO_WHILE]] ] 485; CHECK-NEXT: [[TMP66:%.*]] = shl i129 [[TMP65]], 1 486; CHECK-NEXT: [[TMP67:%.*]] = or i129 [[TMP64]], [[TMP66]] 487; CHECK-NEXT: br label [[UDIV_END]] 488; CHECK: udiv-do-while: 489; CHECK-NEXT: [[TMP68:%.*]] = phi i129 [ 0, [[UDIV_PREHEADER:%.*]] ], [ [[TMP79]], [[UDIV_DO_WHILE]] ] 490; CHECK-NEXT: [[TMP69:%.*]] = phi i129 [ [[TMP86:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP82:%.*]], [[UDIV_DO_WHILE]] ] 491; CHECK-NEXT: [[TMP70:%.*]] = phi i129 [ [[TMP84:%.*]], [[UDIV_PREHEADER]] ], [ [[TMP81:%.*]], [[UDIV_DO_WHILE]] ] 492; CHECK-NEXT: [[TMP71:%.*]] = phi i129 [ [[TMP88]], [[UDIV_PREHEADER]] ], [ [[TMP76]], [[UDIV_DO_WHILE]] ] 493; CHECK-NEXT: [[TMP72:%.*]] = shl i129 [[TMP70]], 1 494; CHECK-NEXT: [[TMP73:%.*]] = lshr i129 [[TMP71]], 128 495; CHECK-NEXT: [[TMP74:%.*]] = or i129 [[TMP72]], [[TMP73]] 496; CHECK-NEXT: [[TMP75:%.*]] = shl i129 [[TMP71]], 1 497; CHECK-NEXT: [[TMP76]] = or i129 [[TMP68]], [[TMP75]] 498; CHECK-NEXT: [[TMP77:%.*]] = sub i129 [[TMP85:%.*]], [[TMP74]] 499; CHECK-NEXT: [[TMP78:%.*]] = ashr i129 [[TMP77]], 128 500; CHECK-NEXT: [[TMP79]] = and i129 [[TMP78]], 1 501; CHECK-NEXT: [[TMP80:%.*]] = and i129 [[TMP78]], [[TMP51]] 502; CHECK-NEXT: [[TMP81]] = sub i129 [[TMP74]], [[TMP80]] 503; CHECK-NEXT: [[TMP82]] = add i129 [[TMP69]], -1 504; CHECK-NEXT: [[TMP83:%.*]] = icmp eq i129 [[TMP82]], 0 505; CHECK-NEXT: br i1 [[TMP83]], label [[UDIV_LOOP_EXIT:%.*]], label [[UDIV_DO_WHILE]] 506; CHECK: udiv-preheader: 507; CHECK-NEXT: [[TMP84]] = lshr i129 [[TMP52]], [[TMP86]] 508; CHECK-NEXT: [[TMP85]] = add i129 [[TMP51]], -1 509; CHECK-NEXT: br label [[UDIV_DO_WHILE]] 510; CHECK: udiv-bb1: 511; CHECK-NEXT: [[TMP86]] = add i129 [[TMP58]], 1 512; CHECK-NEXT: [[TMP87:%.*]] = sub i129 128, [[TMP58]] 513; CHECK-NEXT: [[TMP88]] = shl i129 [[TMP52]], [[TMP87]] 514; CHECK-NEXT: [[TMP89:%.*]] = icmp eq i129 [[TMP86]], 0 515; CHECK-NEXT: br i1 [[TMP89]], label [[UDIV_LOOP_EXIT]], label [[UDIV_PREHEADER]] 516; CHECK: udiv-end: 517; CHECK-NEXT: [[TMP90:%.*]] = phi i129 [ [[TMP67]], [[UDIV_LOOP_EXIT]] ], [ [[TMP62]], [[UDIV_END1]] ] 518; CHECK-NEXT: [[TMP91:%.*]] = mul i129 [[TMP50]], [[TMP90]] 519; CHECK-NEXT: [[TMP92:%.*]] = sub i129 [[TMP49]], [[TMP91]] 520; CHECK-NEXT: [[TMP93:%.*]] = insertelement <2 x i129> [[TMP46]], i129 [[TMP92]], i64 1 521; CHECK-NEXT: ret <2 x i129> [[TMP93]] 522; 523 %res = urem <2 x i129> %a, %b 524 ret <2 x i129> %res 525} 526 527 528define <vscale x 2 x i129> @sdiv129_scalable(<vscale x 2 x i129> %a, <vscale x 2 x i129> %b) nounwind { 529; CHECK-LABEL: define <vscale x 2 x i129> @sdiv129_scalable( 530; CHECK-SAME: <vscale x 2 x i129> [[A:%.*]], <vscale x 2 x i129> [[B:%.*]]) #[[ATTR0]] { 531; CHECK-NEXT: [[RES:%.*]] = sdiv <vscale x 2 x i129> [[A]], [[B]] 532; CHECK-NEXT: ret <vscale x 2 x i129> [[RES]] 533; 534 %res = sdiv <vscale x 2 x i129> %a, %b 535 ret <vscale x 2 x i129> %res 536} 537