brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 90f56a6 Raw
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