201 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -S < %s | FileCheck %s3 4define float @phi_select(i1 %c, float nofpclass(inf) %base, float nofpclass(inf) %arg) {5; CHECK-LABEL: define nofpclass(inf) float @phi_select6; CHECK-SAME: (i1 [[C:%.*]], float nofpclass(inf) [[BASE:%.*]], float nofpclass(inf) [[ARG:%.*]]) #[[ATTR0:[0-9]+]] {7; CHECK-NEXT: entry:8; CHECK-NEXT: br label [[LOOP:%.*]]9; CHECK: loop:10; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[BASE]], [[ENTRY:%.*]] ], [ [[SELECT:%.*]], [[LOOP]] ]11; CHECK-NEXT: [[SELECT]] = select i1 [[C]], float [[PHI]], float [[ARG]]12; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]13; CHECK: exit:14; CHECK-NEXT: ret float [[SELECT]]15;16entry:17 br label %loop18 19loop:20 %phi = phi float [ %base, %entry ], [ %select, %loop ]21 %select = select i1 %c, float %phi, float %arg22 br i1 %c, label %loop, label %exit23 24exit:25 ret float %select26}27 28define float @phi_select_c(i1 %c, float nofpclass(inf) %base, float nofpclass(inf) %arg) {29; CHECK-LABEL: define nofpclass(inf) float @phi_select_c30; CHECK-SAME: (i1 [[C:%.*]], float nofpclass(inf) [[BASE:%.*]], float nofpclass(inf) [[ARG:%.*]]) #[[ATTR0]] {31; CHECK-NEXT: entry:32; CHECK-NEXT: br label [[LOOP:%.*]]33; CHECK: loop:34; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[BASE]], [[ENTRY:%.*]] ], [ [[SELECT:%.*]], [[LOOP]] ]35; CHECK-NEXT: [[SELECT]] = select i1 [[C]], float [[ARG]], float [[PHI]]36; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]37; CHECK: exit:38; CHECK-NEXT: ret float [[SELECT]]39;40entry:41 br label %loop42 43loop:44 %phi = phi float [ %base, %entry ], [ %select, %loop ]45 %select = select i1 %c, float %arg, float %phi46 br i1 %c, label %loop, label %exit47 48exit:49 ret float %select50}51 52define float @phi_select_onlybase(i1 %c, float nofpclass(inf) %base, float %arg) {53; CHECK-LABEL: define float @phi_select_onlybase54; CHECK-SAME: (i1 [[C:%.*]], float nofpclass(inf) [[BASE:%.*]], float [[ARG:%.*]]) #[[ATTR0]] {55; CHECK-NEXT: entry:56; CHECK-NEXT: br label [[LOOP:%.*]]57; CHECK: loop:58; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[BASE]], [[ENTRY:%.*]] ], [ [[SELECT:%.*]], [[LOOP]] ]59; CHECK-NEXT: [[SELECT]] = select i1 [[C]], float [[PHI]], float [[ARG]]60; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]61; CHECK: exit:62; CHECK-NEXT: ret float [[SELECT]]63;64entry:65 br label %loop66 67loop:68 %phi = phi float [ %base, %entry ], [ %select, %loop ]69 %select = select i1 %c, float %phi, float %arg70 br i1 %c, label %loop, label %exit71 72exit:73 ret float %select74}75 76define float @phi_select_onlyarg(i1 %c, float %base, float nofpclass(inf) %arg) {77; CHECK-LABEL: define float @phi_select_onlyarg78; CHECK-SAME: (i1 [[C:%.*]], float [[BASE:%.*]], float nofpclass(inf) [[ARG:%.*]]) #[[ATTR0]] {79; CHECK-NEXT: entry:80; CHECK-NEXT: br label [[LOOP:%.*]]81; CHECK: loop:82; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[BASE]], [[ENTRY:%.*]] ], [ [[SELECT:%.*]], [[LOOP]] ]83; CHECK-NEXT: [[SELECT]] = select i1 [[C]], float [[PHI]], float [[ARG]]84; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]85; CHECK: exit:86; CHECK-NEXT: ret float [[SELECT]]87;88entry:89 br label %loop90 91loop:92 %phi = phi float [ %base, %entry ], [ %select, %loop ]93 %select = select i1 %c, float %phi, float %arg94 br i1 %c, label %loop, label %exit95 96exit:97 ret float %select98}99 100define float @phi_phi(i1 %c, float nofpclass(inf) %base, float nofpclass(inf) %arg) {101; CHECK-LABEL: define nofpclass(inf) float @phi_phi102; CHECK-SAME: (i1 [[C:%.*]], float nofpclass(inf) [[BASE:%.*]], float nofpclass(inf) [[ARG:%.*]]) #[[ATTR0]] {103; CHECK-NEXT: entry:104; CHECK-NEXT: br label [[LOOP:%.*]]105; CHECK: loop:106; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[BASE]], [[ENTRY:%.*]] ], [ [[PHI2:%.*]], [[EXIT1:%.*]] ]107; CHECK-NEXT: br label [[INNER:%.*]]108; CHECK: inner:109; CHECK-NEXT: [[PHI2]] = phi float [ [[PHI]], [[LOOP]] ], [ [[ARG]], [[INNER]] ]110; CHECK-NEXT: br i1 [[C]], label [[INNER]], label [[EXIT1]]111; CHECK: exit1:112; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]113; CHECK: exit:114; CHECK-NEXT: ret float [[PHI2]]115;116entry:117 br label %loop118 119loop:120 %phi = phi float [ %base, %entry ], [ %phi2, %exit1 ]121 br label %inner122 123inner:124 %phi2 = phi float [ %phi, %loop ], [ %arg, %inner ]125 br i1 %c, label %inner, label %exit1126 127exit1:128 br i1 %c, label %loop, label %exit129 130exit:131 ret float %phi2132}133 134define float @phi_phi_onlybase(i1 %c, float nofpclass(inf) %base, float %arg) {135; CHECK-LABEL: define float @phi_phi_onlybase136; CHECK-SAME: (i1 [[C:%.*]], float nofpclass(inf) [[BASE:%.*]], float [[ARG:%.*]]) #[[ATTR0]] {137; CHECK-NEXT: entry:138; CHECK-NEXT: br label [[LOOP:%.*]]139; CHECK: loop:140; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[BASE]], [[ENTRY:%.*]] ], [ [[PHI2:%.*]], [[EXIT1:%.*]] ]141; CHECK-NEXT: br label [[INNER:%.*]]142; CHECK: inner:143; CHECK-NEXT: [[PHI2]] = phi float [ [[PHI]], [[LOOP]] ], [ [[ARG]], [[INNER]] ]144; CHECK-NEXT: br i1 [[C]], label [[INNER]], label [[EXIT1]]145; CHECK: exit1:146; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]147; CHECK: exit:148; CHECK-NEXT: ret float [[PHI2]]149;150entry:151 br label %loop152 153loop:154 %phi = phi float [ %base, %entry ], [ %phi2, %exit1 ]155 br label %inner156 157inner:158 %phi2 = phi float [ %phi, %loop ], [ %arg, %inner ]159 br i1 %c, label %inner, label %exit1160 161exit1:162 br i1 %c, label %loop, label %exit163 164exit:165 ret float %phi2166}167 168define float @phi_phi_onlyarg(i1 %c, float %base, float nofpclass(inf) %arg) {169; CHECK-LABEL: define float @phi_phi_onlyarg170; CHECK-SAME: (i1 [[C:%.*]], float [[BASE:%.*]], float nofpclass(inf) [[ARG:%.*]]) #[[ATTR0]] {171; CHECK-NEXT: entry:172; CHECK-NEXT: br label [[LOOP:%.*]]173; CHECK: loop:174; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[BASE]], [[ENTRY:%.*]] ], [ [[PHI2:%.*]], [[EXIT1:%.*]] ]175; CHECK-NEXT: br label [[INNER:%.*]]176; CHECK: inner:177; CHECK-NEXT: [[PHI2]] = phi float [ [[PHI]], [[LOOP]] ], [ [[ARG]], [[INNER]] ]178; CHECK-NEXT: br i1 [[C]], label [[INNER]], label [[EXIT1]]179; CHECK: exit1:180; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]181; CHECK: exit:182; CHECK-NEXT: ret float [[PHI2]]183;184entry:185 br label %loop186 187loop:188 %phi = phi float [ %base, %entry ], [ %phi2, %exit1 ]189 br label %inner190 191inner:192 %phi2 = phi float [ %phi, %loop ], [ %arg, %inner ]193 br i1 %c, label %inner, label %exit1194 195exit1:196 br i1 %c, label %loop, label %exit197 198exit:199 ret float %phi2200}201