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