brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.1 KiB · 62bb9dc Raw
243 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i32 @const(i1 %cond) {5; CHECK-LABEL: @const(6; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]7; CHECK:       A:8; CHECK-NEXT:    br label [[C:%.*]]9; CHECK:       B:10; CHECK-NEXT:    br label [[C]]11; CHECK:       C:12; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ 1, [[B]] ]13; CHECK-NEXT:    ret i32 [[Y]]14;15  br i1 %cond, label %A, label %B16A:17  br label %C18B:19  br label %C20C:21  %y = phi i32 [0, %A], [1, %B]22  %y.fr = freeze i32 %y23  ret i32 %y.fr24}25 26define <2 x i32> @vec(i1 %cond) {27; CHECK-LABEL: @vec(28; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]29; CHECK:       A:30; CHECK-NEXT:    br label [[C:%.*]]31; CHECK:       B:32; CHECK-NEXT:    br label [[C]]33; CHECK:       C:34; CHECK-NEXT:    [[Y:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[A]] ], [ <i32 2, i32 3>, [[B]] ]35; CHECK-NEXT:    ret <2 x i32> [[Y]]36;37  br i1 %cond, label %A, label %B38A:39  br label %C40B:41  br label %C42C:43  %y = phi <2 x i32> [<i32 0, i32 1>, %A], [<i32 2, i32 3>, %B]44  %y.fr = freeze <2 x i32> %y45  ret <2 x i32> %y.fr46}47 48define <2 x i32> @vec_undef(i1 %cond) {49; CHECK-LABEL: @vec_undef(50; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]51; CHECK:       A:52; CHECK-NEXT:    br label [[C:%.*]]53; CHECK:       B:54; CHECK-NEXT:    br label [[C]]55; CHECK:       C:56; CHECK-NEXT:    [[Y:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[A]] ], [ splat (i32 2), [[B]] ]57; CHECK-NEXT:    ret <2 x i32> [[Y]]58;59  br i1 %cond, label %A, label %B60A:61  br label %C62B:63  br label %C64C:65  %y = phi <2 x i32> [<i32 0, i32 1>, %A], [<i32 2, i32 undef>, %B]66  %y.fr = freeze <2 x i32> %y67  ret <2 x i32> %y.fr68}69 70define i32 @one(i1 %cond, i32 %x) {71; CHECK-LABEL: @one(72; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]73; CHECK:       A:74; CHECK-NEXT:    br label [[C:%.*]]75; CHECK:       B:76; CHECK-NEXT:    [[TMP1:%.*]] = freeze i32 [[X:%.*]]77; CHECK-NEXT:    br label [[C]]78; CHECK:       C:79; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ [[TMP1]], [[B]] ]80; CHECK-NEXT:    ret i32 [[Y]]81;82  br i1 %cond, label %A, label %B83A:84  br label %C85B:86  br label %C87C:88  %y = phi i32 [0, %A], [%x, %B]89  %y.fr = freeze i32 %y90  ret i32 %y.fr91}92 93define i32 @two(i1 %cond, i32 %x, i32 %x2) {94; CHECK-LABEL: @two(95; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]96; CHECK:       A:97; CHECK-NEXT:    br label [[C:%.*]]98; CHECK:       B:99; CHECK-NEXT:    br label [[C]]100; CHECK:       C:101; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ [[X:%.*]], [[A]] ], [ [[X2:%.*]], [[B]] ]102; CHECK-NEXT:    [[Y_FR:%.*]] = freeze i32 [[Y]]103; CHECK-NEXT:    ret i32 [[Y_FR]]104;105  br i1 %cond, label %A, label %B106A:107  br label %C108B:109  br label %C110C:111  %y = phi i32 [%x, %A], [%x2, %B]112  %y.fr = freeze i32 %y113  ret i32 %y.fr114}115 116define i32 @two_undef(i8 %cond, i32 %x) {117; CHECK-LABEL: @two_undef(118; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[A:%.*]] [119; CHECK-NEXT:      i8 0, label [[B:%.*]]120; CHECK-NEXT:      i8 1, label [[C:%.*]]121; CHECK-NEXT:    ]122; CHECK:       A:123; CHECK-NEXT:    br label [[D:%.*]]124; CHECK:       B:125; CHECK-NEXT:    br label [[D]]126; CHECK:       C:127; CHECK-NEXT:    br label [[D]]128; CHECK:       D:129; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ undef, [[A]] ], [ [[X:%.*]], [[B]] ], [ 0, [[C]] ]130; CHECK-NEXT:    [[Y_FR:%.*]] = freeze i32 [[Y]]131; CHECK-NEXT:    ret i32 [[Y_FR]]132;133  switch i8 %cond, label %A [134  i8 0, label %B135  i8 1, label %C136  ]137A:138  br label %D139B:140  br label %D141C:142  br label %D143D:144  %y = phi i32 [undef, %A], [%x, %B], [0, %C]145  %y.fr = freeze i32 %y146  ret i32 %y.fr147}148 149define i32 @one_undef(i8 %cond) {150; CHECK-LABEL: @one_undef(151; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[A:%.*]] [152; CHECK-NEXT:      i8 0, label [[B:%.*]]153; CHECK-NEXT:      i8 1, label [[C:%.*]]154; CHECK-NEXT:    ]155; CHECK:       A:156; CHECK-NEXT:    br label [[D:%.*]]157; CHECK:       B:158; CHECK-NEXT:    br label [[D]]159; CHECK:       C:160; CHECK-NEXT:    br label [[D]]161; CHECK:       D:162; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ 32, [[B]] ], [ 0, [[C]] ]163; CHECK-NEXT:    ret i32 [[Y]]164;165  switch i8 %cond, label %A [166  i8 0, label %B167  i8 1, label %C168  ]169A:170  br label %D171B:172  br label %D173C:174  br label %D175D:176  %y = phi i32 [undef, %A], [32, %B], [0, %C]177  %y.fr = freeze i32 %y178  ret i32 %y.fr179}180 181@glb = global i8 0182 183define i32 @one_constexpr(i8 %cond, i32 %x) {184; CHECK-LABEL: @one_constexpr(185; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[A:%.*]] [186; CHECK-NEXT:      i8 0, label [[B:%.*]]187; CHECK-NEXT:      i8 1, label [[C:%.*]]188; CHECK-NEXT:    ]189; CHECK:       A:190; CHECK-NEXT:    [[TMP1:%.*]] = freeze i32 ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @glb, i64 2) to i32)191; CHECK-NEXT:    br label [[D:%.*]]192; CHECK:       B:193; CHECK-NEXT:    br label [[D]]194; CHECK:       C:195; CHECK-NEXT:    br label [[D]]196; CHECK:       D:197; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ [[TMP1]], [[A]] ], [ 32, [[B]] ], [ 0, [[C]] ]198; CHECK-NEXT:    ret i32 [[Y]]199;200  switch i8 %cond, label %A [201  i8 0, label %B202  i8 1, label %C203  ]204A:205  br label %D206B:207  br label %D208C:209  br label %D210D:211  %y = phi i32 [ptrtoint (ptr getelementptr inbounds (i8, ptr @glb, i64 2) to i32), %A], [32, %B], [0, %C]212  %y.fr = freeze i32 %y213  ret i32 %y.fr214}215 216; Make sure that fmf in phi node is dropped when freeze get folded.217 218define float @pr161524(float noundef %arg) {219; CHECK-LABEL: @pr161524(220; CHECK-NEXT:  entry:221; CHECK-NEXT:    [[COND:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 144)222; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_EXIT:%.*]]223; CHECK:       if.then:224; CHECK-NEXT:    [[FADD:%.*]] = fadd float [[ARG]], 1.000000e+00225; CHECK-NEXT:    br label [[IF_EXIT]]226; CHECK:       if.exit:227; CHECK-NEXT:    [[RET:%.*]] = phi float [ [[FADD]], [[IF_THEN]] ], [ [[ARG]], [[ENTRY:%.*]] ]228; CHECK-NEXT:    ret float [[RET]]229;230entry:231  %cond = tail call i1 @llvm.is.fpclass.f32(float %arg, i32 144)232  br i1 %cond, label %if.then, label %if.exit233 234if.then:235  %fadd = fadd float %arg, 1.0236  br label %if.exit237 238if.exit:239  %ret = phi ninf float [ %fadd, %if.then ], [ %arg, %entry ]240  %ret.fr = freeze float %ret241  ret float %ret.fr242}243