364 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --prefix-filecheck-ir-name _ --version 52; Vary legal integer types in data layout.3; RUN: opt < %s -passes=instcombine -S -data-layout=n32 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK324; RUN: opt < %s -passes=instcombine -S -data-layout=n32:64 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK645 6define i32 @positive1(i64 %a) {7; ALL-LABEL: define i32 @positive1(8; ALL-SAME: i64 [[A:%.*]]) {9; ALL-NEXT: [[ENTRY:.*]]:10; ALL-NEXT: [[TRUNC:%.*]] = trunc i64 [[A]] to i3211; ALL-NEXT: switch i32 [[TRUNC]], label %[[SW_DEFAULT:.*]] [12; ALL-NEXT: i32 10, label %[[RETURN:.*]]13; ALL-NEXT: i32 100, label %[[SW_BB1:.*]]14; ALL-NEXT: i32 1001, label %[[SW_BB2:.*]]15; ALL-NEXT: ]16; ALL: [[SW_BB1]]:17; ALL-NEXT: br label %[[RETURN]]18; ALL: [[SW_BB2]]:19; ALL-NEXT: br label %[[RETURN]]20; ALL: [[SW_DEFAULT]]:21; ALL-NEXT: br label %[[RETURN]]22; ALL: [[RETURN]]:23; ALL-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 24, %[[SW_DEFAULT]] ], [ 123, %[[SW_BB2]] ], [ 213, %[[SW_BB1]] ], [ 231, %[[ENTRY]] ]24; ALL-NEXT: ret i32 [[RETVAL_0]]25;26entry:27 %and = and i64 %a, 429496729528 switch i64 %and, label %sw.default [29 i64 10, label %return30 i64 100, label %sw.bb131 i64 1001, label %sw.bb232 ]33 34sw.bb1:35 br label %return36 37sw.bb2:38 br label %return39 40sw.default:41 br label %return42 43return:44 %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]45 ret i32 %retval.046}47 48define i32 @negative1(i64 %a) {49; ALL-LABEL: define i32 @negative1(50; ALL-SAME: i64 [[A:%.*]]) {51; ALL-NEXT: [[ENTRY:.*]]:52; ALL-NEXT: [[TRUNC:%.*]] = trunc i64 [[A]] to i3253; ALL-NEXT: switch i32 [[TRUNC]], label %[[SW_DEFAULT:.*]] [54; ALL-NEXT: i32 -10, label %[[RETURN:.*]]55; ALL-NEXT: i32 -100, label %[[SW_BB1:.*]]56; ALL-NEXT: i32 -1001, label %[[SW_BB2:.*]]57; ALL-NEXT: ]58; ALL: [[SW_BB1]]:59; ALL-NEXT: br label %[[RETURN]]60; ALL: [[SW_BB2]]:61; ALL-NEXT: br label %[[RETURN]]62; ALL: [[SW_DEFAULT]]:63; ALL-NEXT: br label %[[RETURN]]64; ALL: [[RETURN]]:65; ALL-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 24, %[[SW_DEFAULT]] ], [ 123, %[[SW_BB2]] ], [ 213, %[[SW_BB1]] ], [ 231, %[[ENTRY]] ]66; ALL-NEXT: ret i32 [[RETVAL_0]]67;68entry:69 %or = or i64 %a, -429496729670 switch i64 %or, label %sw.default [71 i64 -10, label %return72 i64 -100, label %sw.bb173 i64 -1001, label %sw.bb274 ]75 76sw.bb1:77 br label %return78 79sw.bb2:80 br label %return81 82sw.default:83 br label %return84 85return:86 %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]87 ret i32 %retval.088}89 90; Make sure truncating a constant int larger than 64-bit doesn't trigger an91; assertion.92 93define i32 @trunc72to68(i72 %a) {94; ALL-LABEL: define i32 @trunc72to68(95; ALL-SAME: i72 [[A:%.*]]) {96; ALL-NEXT: [[ENTRY:.*]]:97; ALL-NEXT: [[TRUNC:%.*]] = trunc i72 [[A]] to i6898; ALL-NEXT: switch i68 [[TRUNC]], label %[[SW_DEFAULT:.*]] [99; ALL-NEXT: i68 10, label %[[RETURN:.*]]100; ALL-NEXT: i68 100, label %[[SW_BB1:.*]]101; ALL-NEXT: i68 1001, label %[[SW_BB2:.*]]102; ALL-NEXT: ]103; ALL: [[SW_BB1]]:104; ALL-NEXT: br label %[[RETURN]]105; ALL: [[SW_BB2]]:106; ALL-NEXT: br label %[[RETURN]]107; ALL: [[SW_DEFAULT]]:108; ALL-NEXT: br label %[[RETURN]]109; ALL: [[RETURN]]:110; ALL-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 24, %[[SW_DEFAULT]] ], [ 123, %[[SW_BB2]] ], [ 213, %[[SW_BB1]] ], [ 231, %[[ENTRY]] ]111; ALL-NEXT: ret i32 [[RETVAL_0]]112;113entry:114 %and = and i72 %a, 295147905179352825855115 switch i72 %and, label %sw.default [116 i72 10, label %return117 i72 100, label %sw.bb1118 i72 1001, label %sw.bb2119 ]120 121sw.bb1:122 br label %return123 124sw.bb2:125 br label %return126 127sw.default:128 br label %return129 130return:131 %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]132 ret i32 %retval.0133}134 135; Make sure to avoid assertion crashes and use the type before136; truncation to generate the sub constant expressions that leads137; to the recomputed condition.138; We allow truncate from i64 to i58 if in 32-bit mode,139; because both are illegal.140 141define void @trunc64to58(i64 %a) {142; CHECK32-LABEL: define void @trunc64to58(143; CHECK32-SAME: i64 [[A:%.*]]) {144; CHECK32-NEXT: [[ENTRY:.*:]]145; CHECK32-NEXT: [[TMP0:%.*]] = trunc i64 [[A]] to i58146; CHECK32-NEXT: [[TMP1:%.*]] = and i58 [[TMP0]], 15147; CHECK32-NEXT: [[TRUNC:%.*]] = mul nuw i58 [[TMP1]], 18717182647723699148; CHECK32-NEXT: switch i58 [[TRUNC]], label %[[SW_DEFAULT:.*]] [149; CHECK32-NEXT: i58 0, label %[[SW_BB1:.*]]150; CHECK32-NEXT: i58 18717182647723699, label %[[SW_BB2:.*]]151; CHECK32-NEXT: ]152; CHECK32: [[SW_BB1]]:153; CHECK32-NEXT: br label %[[SW_DEFAULT]]154; CHECK32: [[SW_BB2]]:155; CHECK32-NEXT: br label %[[SW_DEFAULT]]156; CHECK32: [[SW_DEFAULT]]:157; CHECK32-NEXT: ret void158;159; CHECK64-LABEL: define void @trunc64to58(160; CHECK64-SAME: i64 [[A:%.*]]) {161; CHECK64-NEXT: [[ENTRY:.*:]]162; CHECK64-NEXT: [[_TMP0:%.*]] = and i64 [[A]], 15163; CHECK64-NEXT: [[TMP0:%.*]] = mul nuw nsw i64 [[_TMP0]], 18717182647723699164; CHECK64-NEXT: switch i64 [[TMP0]], label %[[SW_DEFAULT:.*]] [165; CHECK64-NEXT: i64 0, label %[[SW_BB1:.*]]166; CHECK64-NEXT: i64 18717182647723699, label %[[SW_BB2:.*]]167; CHECK64-NEXT: ]168; CHECK64: [[SW_BB1]]:169; CHECK64-NEXT: br label %[[SW_DEFAULT]]170; CHECK64: [[SW_BB2]]:171; CHECK64-NEXT: br label %[[SW_DEFAULT]]172; CHECK64: [[SW_DEFAULT]]:173; CHECK64-NEXT: ret void174;175entry:176 %tmp0 = and i64 %a, 15177 %tmp1 = mul i64 %tmp0, -6425668444178048401178 %tmp2 = add i64 %tmp1, 5170979678563097242179 %tmp3 = mul i64 %tmp2, 1627972535142754813180 switch i64 %tmp3, label %sw.default [181 i64 847514119312061490, label %sw.bb1182 i64 866231301959785189, label %sw.bb2183 ]184 185sw.bb1:186 br label %sw.default187 188sw.bb2:189 br label %sw.default190 191sw.default:192 ret void193}194 195; https://llvm.org/bugs/show_bug.cgi?id=31260196 197define i8 @PR31260(i8 %x) {198; ALL-LABEL: define i8 @PR31260(199; ALL-SAME: i8 [[X:%.*]]) {200; ALL-NEXT: [[ENTRY:.*:]]201; ALL-NEXT: [[T4:%.*]] = and i8 [[X]], 2202; ALL-NEXT: switch i8 [[T4]], label %[[EXIT:.*]] [203; ALL-NEXT: i8 0, label %[[CASE126:.*]]204; ALL-NEXT: i8 2, label %[[CASE124:.*]]205; ALL-NEXT: ]206; ALL: [[EXIT]]:207; ALL-NEXT: ret i8 1208; ALL: [[CASE126]]:209; ALL-NEXT: ret i8 3210; ALL: [[CASE124]]:211; ALL-NEXT: ret i8 5212;213entry:214 %t4 = and i8 %x, 2215 %t5 = add nsw i8 %t4, -126216 switch i8 %t5, label %exit [217 i8 -126, label %case126218 i8 -124, label %case124219 ]220 221exit:222 ret i8 1223case126:224 ret i8 3225case124:226 ret i8 5227}228 229; Make sure the arithmetic evaluation of the switch230; condition is evaluated on the original type231define i32 @trunc32to16(i32 %a0) #0 {232; ALL-LABEL: define i32 @trunc32to16(233; ALL-SAME: i32 [[A0:%.*]]) {234; ALL-NEXT: [[ENTRY:.*:]]235; ALL-NEXT: [[RETVAL:%.*]] = alloca i32, align 4236; ALL-NEXT: [[XOR:%.*]] = lshr i32 [[A0]], 16237; ALL-NEXT: [[TMP0:%.*]] = trunc nuw i32 [[XOR]] to i16238; ALL-NEXT: [[TRUNC:%.*]] = xor i16 [[TMP0]], 15784239; ALL-NEXT: switch i16 [[TRUNC]], label %[[SW_EPILOG:.*]] [240; ALL-NEXT: i16 63, label %[[SW_BB:.*]]241; ALL-NEXT: i16 1, label %[[SW_BB1:.*]]242; ALL-NEXT: i16 100, label %[[SW_BB2:.*]]243; ALL-NEXT: ]244; ALL: [[SW_BB]]:245; ALL-NEXT: store i32 90, ptr [[RETVAL]], align 4246; ALL-NEXT: br label %[[RETURN:.*]]247; ALL: [[SW_BB1]]:248; ALL-NEXT: store i32 91, ptr [[RETVAL]], align 4249; ALL-NEXT: br label %[[RETURN]]250; ALL: [[SW_BB2]]:251; ALL-NEXT: store i32 92, ptr [[RETVAL]], align 4252; ALL-NEXT: br label %[[RETURN]]253; ALL: [[SW_EPILOG]]:254; ALL-NEXT: store i32 113, ptr [[RETVAL]], align 4255; ALL-NEXT: br label %[[RETURN]]256; ALL: [[RETURN]]:257; ALL-NEXT: [[RVAL:%.*]] = load i32, ptr [[RETVAL]], align 4258; ALL-NEXT: ret i32 [[RVAL]]259;260entry:261 %retval = alloca i32, align 4262 %xor = xor i32 %a0, 1034460917263 %shr = lshr i32 %xor, 16264 %add = add i32 %shr, -917677090265 switch i32 %add, label %sw.epilog [266 i32 -917677027, label %sw.bb267 i32 -917677089, label %sw.bb1268 i32 -917676990, label %sw.bb2269 ]270 271sw.bb: ; preds = %entry272 store i32 90, ptr %retval, align 4273 br label %return274 275sw.bb1: ; preds = %entry276 store i32 91, ptr %retval, align 4277 br label %return278 279sw.bb2: ; preds = %entry280 store i32 92, ptr %retval, align 4281 br label %return282 283sw.epilog: ; preds = %entry284 store i32 113, ptr %retval, align 4285 br label %return286 287return: ; preds = %sw.epilog, %sw.bb2,288 %rval = load i32, ptr %retval, align 4289 ret i32 %rval290}291 292; https://llvm.org/bugs/show_bug.cgi?id=29009293 294@a = global i32 0, align 4295@njob = global i32 0, align 4296 297declare i32 @goo()298 299; Make sure we do not shrink to illegal types (i3 in this case)300; if original type is legal (i32 in this case)301 302define void @PR29009() {303; ALL-LABEL: define void @PR29009() {304; ALL-NEXT: br label %[[BB1:.*]]305; ALL: [[BB1]]:306; ALL-NEXT: [[TMP2:%.*]] = load volatile i32, ptr @njob, align 4307; ALL-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP2]], 0308; ALL-NEXT: br i1 [[DOTNOT]], label %[[BB10:.*]], label %[[BB3:.*]]309; ALL: [[BB3]]:310; ALL-NEXT: [[TMP4:%.*]] = call i32 @goo()311; ALL-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], 7312; ALL-NEXT: switch i32 [[TMP5]], label %[[BB6:.*]] [313; ALL-NEXT: i32 0, label %[[BB7:.*]]314; ALL-NEXT: i32 3, label %[[BB8:.*]]315; ALL-NEXT: ]316; ALL: [[BB6]]:317; ALL-NEXT: store i32 6, ptr @a, align 4318; ALL-NEXT: br label %[[BB9:.*]]319; ALL: [[BB7]]:320; ALL-NEXT: store i32 1, ptr @a, align 4321; ALL-NEXT: br label %[[BB9]]322; ALL: [[BB8]]:323; ALL-NEXT: store i32 2, ptr @a, align 4324; ALL-NEXT: br label %[[BB9]]325; ALL: [[BB9]]:326; ALL-NEXT: br label %[[BB1]]327; ALL: [[BB10]]:328; ALL-NEXT: ret void329;330 br label %1331 332; <label>:1: ; preds = %10, %0333 %2 = load volatile i32, ptr @njob, align 4334 %3 = icmp ne i32 %2, 0335 br i1 %3, label %4, label %11336 337; <label>:4: ; preds = %1338 %5 = call i32 @goo()339 %6 = and i32 %5, 7340 switch i32 %6, label %7 [341 i32 0, label %8342 i32 3, label %9343 ]344 345; <label>:7: ; preds = %4346 store i32 6, ptr @a, align 4347 br label %10348 349; <label>:8: ; preds = %4350 store i32 1, ptr @a, align 4351 br label %10352 353; <label>:9: ; preds = %4354 store i32 2, ptr @a, align 4355 br label %10356 357; <label>:10: ; preds = %13, %12, %11, %10, %9, %8, %7358 br label %1359 360; <label>:11: ; preds = %1361 ret void362}363 364