brintos

brintos / llvm-project-archived public Read only

0
0
Text · 41.4 KiB · e7ab02c Raw
1225 lines · plain
1; RUN: opt -S -passes=loop-vectorize,dce -force-vector-width=2 -force-vector-interleave=2  < %s | FileCheck %s2 3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"4 5@A = common global [1024 x i32] zeroinitializer, align 166@fA = common global [1024 x float] zeroinitializer, align 167@dA = common global [1024 x double] zeroinitializer, align 168 9; Signed tests.10 11; Turn this into a max reduction. Make sure we use a splat to initialize the12; vector for the reduction.13; CHECK-LABEL: @max_red(14; CHECK: %[[VAR:.*]] = insertelement <2 x i32> poison, i32 %max, i64 015; CHECK: {{.*}} = shufflevector <2 x i32> %[[VAR]], <2 x i32> poison, <2 x i32> zeroinitializer16; CHECK: icmp sgt <2 x i32>17; CHECK: select <2 x i1>18; CHECK: middle.block19; CHECK: call i32 @llvm.vector.reduce.smax.v2i3220 21define i32 @max_red(i32 %max) {22entry:23  br label %for.body24 25for.body:26  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]27  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]28  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv29  %0 = load i32, ptr %arrayidx, align 430  %cmp3 = icmp sgt i32 %0, %max.red.0831  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.0832  %indvars.iv.next = add i64 %indvars.iv, 133  %lftr.wideiv = trunc i64 %indvars.iv.next to i3234  %exitcond = icmp eq i32 %lftr.wideiv, 102435  br i1 %exitcond, label %for.end, label %for.body36 37for.end:38  ret i32 %max.red.039}40 41; Turn this into a max reduction. The select has its inputs reversed therefore42; this is a max reduction.43; CHECK-LABEL: @max_red_inverse_select(44; CHECK: icmp slt <2 x i32>45; CHECK: select <2 x i1>46; CHECK: middle.block47; CHECK: call i32 @llvm.vector.reduce.smax.v2i3248 49define i32 @max_red_inverse_select(i32 %max) {50entry:51  br label %for.body52 53for.body:54  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]55  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]56  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv57  %0 = load i32, ptr %arrayidx, align 458  %cmp3 = icmp slt i32 %max.red.08, %059  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.0860  %indvars.iv.next = add i64 %indvars.iv, 161  %lftr.wideiv = trunc i64 %indvars.iv.next to i3262  %exitcond = icmp eq i32 %lftr.wideiv, 102463  br i1 %exitcond, label %for.end, label %for.body64 65for.end:66  ret i32 %max.red.067}68 69; Turn this into a min reduction.70; CHECK-LABEL: @min_red(71; CHECK: icmp slt <2 x i32>72; CHECK: select <2 x i1>73; CHECK: middle.block74; CHECK: call i32 @llvm.vector.reduce.smin.v2i3275 76define i32 @min_red(i32 %max) {77entry:78  br label %for.body79 80for.body:81  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]82  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]83  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv84  %0 = load i32, ptr %arrayidx, align 485  %cmp3 = icmp slt i32 %0, %max.red.0886  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.0887  %indvars.iv.next = add i64 %indvars.iv, 188  %lftr.wideiv = trunc i64 %indvars.iv.next to i3289  %exitcond = icmp eq i32 %lftr.wideiv, 102490  br i1 %exitcond, label %for.end, label %for.body91 92for.end:93  ret i32 %max.red.094}95 96; Turn this into a min reduction. The select has its inputs reversed therefore97; this is a min reduction.98; CHECK-LABEL: @min_red_inverse_select(99; CHECK: icmp sgt <2 x i32>100; CHECK: select <2 x i1>101; CHECK: middle.block102; CHECK: call i32 @llvm.vector.reduce.smin.v2i32103 104define i32 @min_red_inverse_select(i32 %max) {105entry:106  br label %for.body107 108for.body:109  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]110  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]111  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv112  %0 = load i32, ptr %arrayidx, align 4113  %cmp3 = icmp sgt i32 %max.red.08, %0114  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.08115  %indvars.iv.next = add i64 %indvars.iv, 1116  %lftr.wideiv = trunc i64 %indvars.iv.next to i32117  %exitcond = icmp eq i32 %lftr.wideiv, 1024118  br i1 %exitcond, label %for.end, label %for.body119 120for.end:121  ret i32 %max.red.0122}123 124; Unsigned tests.125 126; Turn this into a max reduction.127; CHECK-LABEL: @umax_red(128; CHECK: icmp ugt <2 x i32>129; CHECK: select <2 x i1>130; CHECK: middle.block131; CHECK: call i32 @llvm.vector.reduce.umax.v2i32132 133define i32 @umax_red(i32 %max) {134entry:135  br label %for.body136 137for.body:138  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]139  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]140  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv141  %0 = load i32, ptr %arrayidx, align 4142  %cmp3 = icmp ugt i32 %0, %max.red.08143  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.08144  %indvars.iv.next = add i64 %indvars.iv, 1145  %lftr.wideiv = trunc i64 %indvars.iv.next to i32146  %exitcond = icmp eq i32 %lftr.wideiv, 1024147  br i1 %exitcond, label %for.end, label %for.body148 149for.end:150  ret i32 %max.red.0151}152 153; Turn this into a max reduction. The select has its inputs reversed therefore154; this is a max reduction.155; CHECK-LABEL: @umax_red_inverse_select(156; CHECK: icmp ult <2 x i32>157; CHECK: select <2 x i1>158; CHECK: middle.block159; CHECK: call i32 @llvm.vector.reduce.umax.v2i32160 161define i32 @umax_red_inverse_select(i32 %max) {162entry:163  br label %for.body164 165for.body:166  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]167  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]168  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv169  %0 = load i32, ptr %arrayidx, align 4170  %cmp3 = icmp ult i32 %max.red.08, %0171  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.08172  %indvars.iv.next = add i64 %indvars.iv, 1173  %lftr.wideiv = trunc i64 %indvars.iv.next to i32174  %exitcond = icmp eq i32 %lftr.wideiv, 1024175  br i1 %exitcond, label %for.end, label %for.body176 177for.end:178  ret i32 %max.red.0179}180 181; Turn this into a min reduction.182; CHECK-LABEL: @umin_red(183; CHECK: icmp ult <2 x i32>184; CHECK: select <2 x i1>185; CHECK: middle.block186; CHECK: call i32 @llvm.vector.reduce.umin.v2i32187 188define i32 @umin_red(i32 %max) {189entry:190  br label %for.body191 192for.body:193  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]194  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]195  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv196  %0 = load i32, ptr %arrayidx, align 4197  %cmp3 = icmp ult i32 %0, %max.red.08198  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.08199  %indvars.iv.next = add i64 %indvars.iv, 1200  %lftr.wideiv = trunc i64 %indvars.iv.next to i32201  %exitcond = icmp eq i32 %lftr.wideiv, 1024202  br i1 %exitcond, label %for.end, label %for.body203 204for.end:205  ret i32 %max.red.0206}207 208; Turn this into a min reduction. The select has its inputs reversed therefore209; this is a min reduction.210; CHECK-LABEL: @umin_red_inverse_select(211; CHECK: icmp ugt <2 x i32>212; CHECK: select <2 x i1>213; CHECK: middle.block214; CHECK: call i32 @llvm.vector.reduce.umin.v2i32215 216define i32 @umin_red_inverse_select(i32 %max) {217entry:218  br label %for.body219 220for.body:221  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]222  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]223  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv224  %0 = load i32, ptr %arrayidx, align 4225  %cmp3 = icmp ugt i32 %max.red.08, %0226  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.08227  %indvars.iv.next = add i64 %indvars.iv, 1228  %lftr.wideiv = trunc i64 %indvars.iv.next to i32229  %exitcond = icmp eq i32 %lftr.wideiv, 1024230  br i1 %exitcond, label %for.end, label %for.body231 232for.end:233  ret i32 %max.red.0234}235 236; SGE -> SLT237; Turn this into a min reduction (select inputs are reversed).238; CHECK-LABEL: @sge_min_red(239; CHECK: icmp sge <2 x i32>240; CHECK: select <2 x i1>241; CHECK: middle.block242; CHECK: call i32 @llvm.vector.reduce.smin.v2i32243 244define i32 @sge_min_red(i32 %max) {245entry:246  br label %for.body247 248for.body:249  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]250  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]251  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv252  %0 = load i32, ptr %arrayidx, align 4253  %cmp3 = icmp sge i32 %0, %max.red.08254  %max.red.0 = select i1 %cmp3, i32 %max.red.08, i32 %0255  %indvars.iv.next = add i64 %indvars.iv, 1256  %lftr.wideiv = trunc i64 %indvars.iv.next to i32257  %exitcond = icmp eq i32 %lftr.wideiv, 1024258  br i1 %exitcond, label %for.end, label %for.body259 260for.end:261  ret i32 %max.red.0262}263 264; SLE -> SGT265; Turn this into a max reduction (select inputs are reversed).266; CHECK-LABEL: @sle_min_red(267; CHECK: icmp sle <2 x i32>268; CHECK: select <2 x i1>269; CHECK: middle.block270; CHECK: call i32 @llvm.vector.reduce.smax.v2i32271 272define i32 @sle_min_red(i32 %max) {273entry:274  br label %for.body275 276for.body:277  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]278  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]279  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv280  %0 = load i32, ptr %arrayidx, align 4281  %cmp3 = icmp sle i32 %0, %max.red.08282  %max.red.0 = select i1 %cmp3, i32 %max.red.08, i32 %0283  %indvars.iv.next = add i64 %indvars.iv, 1284  %lftr.wideiv = trunc i64 %indvars.iv.next to i32285  %exitcond = icmp eq i32 %lftr.wideiv, 1024286  br i1 %exitcond, label %for.end, label %for.body287 288for.end:289  ret i32 %max.red.0290}291 292; UGE -> ULT293; Turn this into a min reduction (select inputs are reversed).294; CHECK-LABEL: @uge_min_red(295; CHECK: icmp uge <2 x i32>296; CHECK: select <2 x i1>297; CHECK: middle.block298; CHECK: call i32 @llvm.vector.reduce.umin.v2i32299 300define i32 @uge_min_red(i32 %max) {301entry:302  br label %for.body303 304for.body:305  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]306  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]307  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv308  %0 = load i32, ptr %arrayidx, align 4309  %cmp3 = icmp uge i32 %0, %max.red.08310  %max.red.0 = select i1 %cmp3, i32 %max.red.08, i32 %0311  %indvars.iv.next = add i64 %indvars.iv, 1312  %lftr.wideiv = trunc i64 %indvars.iv.next to i32313  %exitcond = icmp eq i32 %lftr.wideiv, 1024314  br i1 %exitcond, label %for.end, label %for.body315 316for.end:317  ret i32 %max.red.0318}319 320; ULE -> UGT321; Turn this into a max reduction (select inputs are reversed).322; CHECK-LABEL: @ule_min_red(323; CHECK: icmp ule <2 x i32>324; CHECK: select <2 x i1>325; CHECK: middle.block326; CHECK: call i32 @llvm.vector.reduce.umax.v2i32327 328define i32 @ule_min_red(i32 %max) {329entry:330  br label %for.body331 332for.body:333  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]334  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]335  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv336  %0 = load i32, ptr %arrayidx, align 4337  %cmp3 = icmp ule i32 %0, %max.red.08338  %max.red.0 = select i1 %cmp3, i32 %max.red.08, i32 %0339  %indvars.iv.next = add i64 %indvars.iv, 1340  %lftr.wideiv = trunc i64 %indvars.iv.next to i32341  %exitcond = icmp eq i32 %lftr.wideiv, 1024342  br i1 %exitcond, label %for.end, label %for.body343 344for.end:345  ret i32 %max.red.0346}347 348; No reduction.349; CHECK-LABEL: @no_red_1(350; CHECK-NOT: icmp <2 x i32>351define i32 @no_red_1(i32 %max) {352entry:353  br label %for.body354 355for.body:356  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]357  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]358  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv359  %arrayidx1 = getelementptr inbounds [1024 x i32], ptr @A, i64 1, i64 %indvars.iv360  %0 = load i32, ptr %arrayidx, align 4361  %1 = load i32, ptr %arrayidx1, align 4362  %cmp3 = icmp sgt i32 %0, %1363  %max.red.0 = select i1 %cmp3, i32 %0, i32 %max.red.08364  %indvars.iv.next = add i64 %indvars.iv, 1365  %lftr.wideiv = trunc i64 %indvars.iv.next to i32366  %exitcond = icmp eq i32 %lftr.wideiv, 1024367  br i1 %exitcond, label %for.end, label %for.body368 369for.end:370  ret i32 %max.red.0371}372 373; CHECK-LABEL: @no_red_2(374; CHECK-NOT: icmp <2 x i32>375define i32 @no_red_2(i32 %max) {376entry:377  br label %for.body378 379for.body:380  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]381  %max.red.08 = phi i32 [ %max, %entry ], [ %max.red.0, %for.body ]382  %arrayidx = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 %indvars.iv383  %arrayidx1 = getelementptr inbounds [1024 x i32], ptr @A, i64 1, i64 %indvars.iv384  %0 = load i32, ptr %arrayidx, align 4385  %1 = load i32, ptr %arrayidx1, align 4386  %cmp3 = icmp sgt i32 %0, %max.red.08387  %max.red.0 = select i1 %cmp3, i32 %0, i32 %1388  %indvars.iv.next = add i64 %indvars.iv, 1389  %lftr.wideiv = trunc i64 %indvars.iv.next to i32390  %exitcond = icmp eq i32 %lftr.wideiv, 1024391  br i1 %exitcond, label %for.end, label %for.body392 393for.end:394  ret i32 %max.red.0395}396 397; Float tests.398 399; Maximum.400 401; Turn this into a max reduction in the presence of a no-nans-fp-math attribute.402; CHECK-LABEL: @max_red_float(403; CHECK: fcmp fast ogt <2 x float>404; CHECK: select <2 x i1>405; CHECK: middle.block406; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32407 408define float @max_red_float(float %max) #0 {409entry:410  br label %for.body411 412for.body:413  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]414  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]415  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv416  %0 = load float, ptr %arrayidx, align 4417  %cmp3 = fcmp fast ogt float %0, %max.red.08418  %max.red.0 = select i1 %cmp3, float %0, float %max.red.08419  %indvars.iv.next = add i64 %indvars.iv, 1420  %exitcond = icmp eq i64 %indvars.iv.next, 1024421  br i1 %exitcond, label %for.end, label %for.body422 423for.end:424  ret float %max.red.0425}426 427; CHECK-LABEL: @max_red_float_ge(428; CHECK: fcmp fast oge <2 x float>429; CHECK: select <2 x i1>430; CHECK: middle.block431; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32432 433define float @max_red_float_ge(float %max) #0 {434entry:435  br label %for.body436 437for.body:438  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]439  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]440  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv441  %0 = load float, ptr %arrayidx, align 4442  %cmp3 = fcmp fast oge float %0, %max.red.08443  %max.red.0 = select i1 %cmp3, float %0, float %max.red.08444  %indvars.iv.next = add i64 %indvars.iv, 1445  %exitcond = icmp eq i64 %indvars.iv.next, 1024446  br i1 %exitcond, label %for.end, label %for.body447 448for.end:449  ret float %max.red.0450}451 452; CHECK-LABEL: @inverted_max_red_float(453; CHECK: fcmp fast olt <2 x float>454; CHECK: select <2 x i1>455; CHECK: middle.block456; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32457 458define float @inverted_max_red_float(float %max) #0 {459entry:460  br label %for.body461 462for.body:463  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]464  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]465  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv466  %0 = load float, ptr %arrayidx, align 4467  %cmp3 = fcmp fast olt float %0, %max.red.08468  %max.red.0 = select i1 %cmp3, float %max.red.08, float %0469  %indvars.iv.next = add i64 %indvars.iv, 1470  %exitcond = icmp eq i64 %indvars.iv.next, 1024471  br i1 %exitcond, label %for.end, label %for.body472 473for.end:474  ret float %max.red.0475}476 477; CHECK-LABEL: @inverted_max_red_float_le(478; CHECK: fcmp fast ole <2 x float>479; CHECK: select <2 x i1>480; CHECK: middle.block481; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32482 483define float @inverted_max_red_float_le(float %max) #0 {484entry:485  br label %for.body486 487for.body:488  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]489  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]490  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv491  %0 = load float, ptr %arrayidx, align 4492  %cmp3 = fcmp fast ole float %0, %max.red.08493  %max.red.0 = select i1 %cmp3, float %max.red.08, float %0494  %indvars.iv.next = add i64 %indvars.iv, 1495  %exitcond = icmp eq i64 %indvars.iv.next, 1024496  br i1 %exitcond, label %for.end, label %for.body497 498for.end:499  ret float %max.red.0500}501 502; CHECK-LABEL: @unordered_max_red_float(503; CHECK: fcmp fast ugt <2 x float>504; CHECK: select <2 x i1>505; CHECK: middle.block506; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32507 508define float @unordered_max_red_float(float %max) #0 {509entry:510  br label %for.body511 512for.body:513  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]514  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]515  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv516  %0 = load float, ptr %arrayidx, align 4517  %cmp3 = fcmp fast ugt float %0, %max.red.08518  %max.red.0 = select i1 %cmp3, float %0, float %max.red.08519  %indvars.iv.next = add i64 %indvars.iv, 1520  %exitcond = icmp eq i64 %indvars.iv.next, 1024521  br i1 %exitcond, label %for.end, label %for.body522 523for.end:524  ret float %max.red.0525}526 527; CHECK-LABEL: @unordered_max_red_float_ge(528; CHECK: fcmp fast uge <2 x float>529; CHECK: select <2 x i1>530; CHECK: middle.block531; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32532 533define float @unordered_max_red_float_ge(float %max) #0 {534entry:535  br label %for.body536 537for.body:538  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]539  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]540  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv541  %0 = load float, ptr %arrayidx, align 4542  %cmp3 = fcmp fast uge float %0, %max.red.08543  %max.red.0 = select i1 %cmp3, float %0, float %max.red.08544  %indvars.iv.next = add i64 %indvars.iv, 1545  %exitcond = icmp eq i64 %indvars.iv.next, 1024546  br i1 %exitcond, label %for.end, label %for.body547 548for.end:549  ret float %max.red.0550}551 552; CHECK-LABEL: @inverted_unordered_max_red_float(553; CHECK: fcmp fast ult <2 x float>554; CHECK: select <2 x i1>555; CHECK: middle.block556; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32557 558define float @inverted_unordered_max_red_float(float %max) #0 {559entry:560  br label %for.body561 562for.body:563  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]564  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]565  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv566  %0 = load float, ptr %arrayidx, align 4567  %cmp3 = fcmp fast ult float %0, %max.red.08568  %max.red.0 = select i1 %cmp3, float %max.red.08, float %0569  %indvars.iv.next = add i64 %indvars.iv, 1570  %exitcond = icmp eq i64 %indvars.iv.next, 1024571  br i1 %exitcond, label %for.end, label %for.body572 573for.end:574  ret float %max.red.0575}576 577; CHECK-LABEL: @inverted_unordered_max_red_float_le(578; CHECK: fcmp fast ule <2 x float>579; CHECK: select <2 x i1>580; CHECK: middle.block581; CHECK: call fast float @llvm.vector.reduce.fmax.v2f32582 583define float @inverted_unordered_max_red_float_le(float %max) #0 {584entry:585  br label %for.body586 587for.body:588  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]589  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]590  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv591  %0 = load float, ptr %arrayidx, align 4592  %cmp3 = fcmp fast ule float %0, %max.red.08593  %max.red.0 = select i1 %cmp3, float %max.red.08, float %0594  %indvars.iv.next = add i64 %indvars.iv, 1595  %exitcond = icmp eq i64 %indvars.iv.next, 1024596  br i1 %exitcond, label %for.end, label %for.body597 598for.end:599  ret float %max.red.0600}601 602; Minimum.603 604; Turn this into a min reduction in the presence of a no-nans-fp-math attribute.605; CHECK-LABEL: @min_red_float(606; CHECK: fcmp fast olt <2 x float>607; CHECK: select <2 x i1>608; CHECK: middle.block609; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32610 611define float @min_red_float(float %min) #0 {612entry:613  br label %for.body614 615for.body:616  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]617  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]618  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv619  %0 = load float, ptr %arrayidx, align 4620  %cmp3 = fcmp fast olt float %0, %min.red.08621  %min.red.0 = select i1 %cmp3, float %0, float %min.red.08622  %indvars.iv.next = add i64 %indvars.iv, 1623  %exitcond = icmp eq i64 %indvars.iv.next, 1024624  br i1 %exitcond, label %for.end, label %for.body625 626for.end:627  ret float %min.red.0628}629 630; CHECK-LABEL: @min_red_float_le(631; CHECK: fcmp fast ole <2 x float>632; CHECK: select <2 x i1>633; CHECK: middle.block634; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32635 636define float @min_red_float_le(float %min) #0 {637entry:638  br label %for.body639 640for.body:641  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]642  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]643  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv644  %0 = load float, ptr %arrayidx, align 4645  %cmp3 = fcmp fast ole float %0, %min.red.08646  %min.red.0 = select i1 %cmp3, float %0, float %min.red.08647  %indvars.iv.next = add i64 %indvars.iv, 1648  %exitcond = icmp eq i64 %indvars.iv.next, 1024649  br i1 %exitcond, label %for.end, label %for.body650 651for.end:652  ret float %min.red.0653}654 655; CHECK-LABEL: @inverted_min_red_float(656; CHECK: fcmp fast ogt <2 x float>657; CHECK: select <2 x i1>658; CHECK: middle.block659; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32660 661define float @inverted_min_red_float(float %min) #0 {662entry:663  br label %for.body664 665for.body:666  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]667  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]668  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv669  %0 = load float, ptr %arrayidx, align 4670  %cmp3 = fcmp fast ogt float %0, %min.red.08671  %min.red.0 = select i1 %cmp3, float %min.red.08, float %0672  %indvars.iv.next = add i64 %indvars.iv, 1673  %exitcond = icmp eq i64 %indvars.iv.next, 1024674  br i1 %exitcond, label %for.end, label %for.body675 676for.end:677  ret float %min.red.0678}679 680; CHECK-LABEL: @inverted_min_red_float_ge(681; CHECK: fcmp fast oge <2 x float>682; CHECK: select <2 x i1>683; CHECK: middle.block684; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32685 686define float @inverted_min_red_float_ge(float %min) #0 {687entry:688  br label %for.body689 690for.body:691  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]692  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]693  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv694  %0 = load float, ptr %arrayidx, align 4695  %cmp3 = fcmp fast oge float %0, %min.red.08696  %min.red.0 = select i1 %cmp3, float %min.red.08, float %0697  %indvars.iv.next = add i64 %indvars.iv, 1698  %exitcond = icmp eq i64 %indvars.iv.next, 1024699  br i1 %exitcond, label %for.end, label %for.body700 701for.end:702  ret float %min.red.0703}704 705; CHECK-LABEL: @unordered_min_red_float(706; CHECK: fcmp fast ult <2 x float>707; CHECK: select <2 x i1>708; CHECK: middle.block709; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32710 711define float @unordered_min_red_float(float %min) #0 {712entry:713  br label %for.body714 715for.body:716  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]717  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]718  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv719  %0 = load float, ptr %arrayidx, align 4720  %cmp3 = fcmp fast ult float %0, %min.red.08721  %min.red.0 = select i1 %cmp3, float %0, float %min.red.08722  %indvars.iv.next = add i64 %indvars.iv, 1723  %exitcond = icmp eq i64 %indvars.iv.next, 1024724  br i1 %exitcond, label %for.end, label %for.body725 726for.end:727  ret float %min.red.0728}729 730; CHECK-LABEL: @unordered_min_red_float_le(731; CHECK: fcmp fast ule <2 x float>732; CHECK: select <2 x i1>733; CHECK: middle.block734; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32735 736define float @unordered_min_red_float_le(float %min) #0 {737entry:738  br label %for.body739 740for.body:741  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]742  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]743  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv744  %0 = load float, ptr %arrayidx, align 4745  %cmp3 = fcmp fast ule float %0, %min.red.08746  %min.red.0 = select i1 %cmp3, float %0, float %min.red.08747  %indvars.iv.next = add i64 %indvars.iv, 1748  %exitcond = icmp eq i64 %indvars.iv.next, 1024749  br i1 %exitcond, label %for.end, label %for.body750 751for.end:752  ret float %min.red.0753}754 755; CHECK-LABEL: @inverted_unordered_min_red_float(756; CHECK: fcmp fast ugt <2 x float>757; CHECK: select <2 x i1>758; CHECK: middle.block759; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32760 761define float @inverted_unordered_min_red_float(float %min) #0 {762entry:763  br label %for.body764 765for.body:766  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]767  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]768  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv769  %0 = load float, ptr %arrayidx, align 4770  %cmp3 = fcmp fast ugt float %0, %min.red.08771  %min.red.0 = select i1 %cmp3, float %min.red.08, float %0772  %indvars.iv.next = add i64 %indvars.iv, 1773  %exitcond = icmp eq i64 %indvars.iv.next, 1024774  br i1 %exitcond, label %for.end, label %for.body775 776for.end:777  ret float %min.red.0778}779 780; CHECK-LABEL: @inverted_unordered_min_red_float_ge(781; CHECK: fcmp fast uge <2 x float>782; CHECK: select <2 x i1>783; CHECK: middle.block784; CHECK: call fast float @llvm.vector.reduce.fmin.v2f32785 786define float @inverted_unordered_min_red_float_ge(float %min) #0 {787entry:788  br label %for.body789 790for.body:791  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]792  %min.red.08 = phi float [ %min, %entry ], [ %min.red.0, %for.body ]793  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv794  %0 = load float, ptr %arrayidx, align 4795  %cmp3 = fcmp fast uge float %0, %min.red.08796  %min.red.0 = select i1 %cmp3, float %min.red.08, float %0797  %indvars.iv.next = add i64 %indvars.iv, 1798  %exitcond = icmp eq i64 %indvars.iv.next, 1024799  br i1 %exitcond, label %for.end, label %for.body800 801for.end:802  ret float %min.red.0803}804 805; Make sure we handle doubles, too.806; CHECK-LABEL: @min_red_double(807; CHECK: fcmp fast olt <2 x double>808; CHECK: select <2 x i1>809; CHECK: middle.block810; CHECK: call fast double @llvm.vector.reduce.fmin.v2f64811 812define double @min_red_double(double %min) #0 {813entry:814  br label %for.body815 816for.body:817  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]818  %min.red.08 = phi double [ %min, %entry ], [ %min.red.0, %for.body ]819  %arrayidx = getelementptr inbounds [1024 x double], ptr @dA, i64 0, i64 %indvars.iv820  %0 = load double, ptr %arrayidx, align 4821  %cmp3 = fcmp fast olt double %0, %min.red.08822  %min.red.0 = select i1 %cmp3, double %0, double %min.red.08823  %indvars.iv.next = add i64 %indvars.iv, 1824  %exitcond = icmp eq i64 %indvars.iv.next, 1024825  br i1 %exitcond, label %for.end, label %for.body826 827for.end:828  ret double %min.red.0829}830 831 832; Don't this into a max reduction. The no-nans-fp-math attribute is missing833; CHECK-LABEL: @max_red_float_nans(834; CHECK-NOT: <2 x float>835 836define float @max_red_float_nans(float %max) {837entry:838  br label %for.body839 840for.body:841  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]842  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]843  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv844  %0 = load float, ptr %arrayidx, align 4845  %cmp3 = fcmp fast ogt float %0, %max.red.08846  %max.red.0 = select i1 %cmp3, float %0, float %max.red.08847  %indvars.iv.next = add i64 %indvars.iv, 1848  %exitcond = icmp eq i64 %indvars.iv.next, 1024849  br i1 %exitcond, label %for.end, label %for.body850 851for.end:852  ret float %max.red.0853}854 855; As above, with the no-signed-zeros-fp-math attribute missing856; CHECK-LABEL: @max_red_float_nsz(857; CHECK-NOT: <2 x float>858 859define float @max_red_float_nsz(float %max) #1 {860entry:861  br label %for.body862 863for.body:864  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]865  %max.red.08 = phi float [ %max, %entry ], [ %max.red.0, %for.body ]866  %arrayidx = getelementptr inbounds [1024 x float], ptr @fA, i64 0, i64 %indvars.iv867  %0 = load float, ptr %arrayidx, align 4868  %cmp3 = fcmp fast ogt float %0, %max.red.08869  %max.red.0 = select i1 %cmp3, float %0, float %max.red.08870  %indvars.iv.next = add i64 %indvars.iv, 1871  %exitcond = icmp eq i64 %indvars.iv.next, 1024872  br i1 %exitcond, label %for.end, label %for.body873 874for.end:875  ret float %max.red.0876}877 878; CHECK-LABEL: @smin_intrinsic(879; CHECK: <2 x i32> @llvm.smin.v2i32880; CHECK: i32 @llvm.vector.reduce.smin.v2i32881define i32 @smin_intrinsic(ptr nocapture readonly %x) {882entry:883  br label %for.body884 885for.body:                                         ; preds = %entry, %for.body886  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]887  %s.011 = phi i32 [ 100, %entry ], [ %1, %for.body ]888  %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.012889  %0 = load i32, ptr %arrayidx, align 4890  %1 = tail call i32 @llvm.smin.i32(i32 %s.011, i32 %0)891  %inc = add nuw nsw i32 %i.012, 1892  %exitcond.not = icmp eq i32 %inc, 1024893  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body894 895for.cond.cleanup:                                 ; preds = %for.body896  ret i32 %1897}898 899; CHECK-LABEL: @smax_intrinsic(900; CHECK: <2 x i32> @llvm.smax.v2i32901; CHECK: i32 @llvm.vector.reduce.smax.v2i32902define i32 @smax_intrinsic(ptr nocapture readonly %x) {903entry:904  br label %for.body905 906for.body:                                         ; preds = %entry, %for.body907  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]908  %s.011 = phi i32 [ 100, %entry ], [ %1, %for.body ]909  %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.012910  %0 = load i32, ptr %arrayidx, align 4911  %1 = tail call i32 @llvm.smax.i32(i32 %s.011, i32 %0)912  %inc = add nuw nsw i32 %i.012, 1913  %exitcond.not = icmp eq i32 %inc, 1024914  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body915 916for.cond.cleanup:                                 ; preds = %for.body917  ret i32 %1918}919 920; CHECK-LABEL: @umin_intrinsic(921; CHECK: <2 x i32> @llvm.umin.v2i32922; CHECK: i32 @llvm.vector.reduce.umin.v2i32923define i32 @umin_intrinsic(ptr nocapture readonly %x) {924entry:925  br label %for.body926 927for.body:                                         ; preds = %entry, %for.body928  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]929  %s.011 = phi i32 [ 100, %entry ], [ %1, %for.body ]930  %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.012931  %0 = load i32, ptr %arrayidx, align 4932  %1 = tail call i32 @llvm.umin.i32(i32 %s.011, i32 %0)933  %inc = add nuw nsw i32 %i.012, 1934  %exitcond.not = icmp eq i32 %inc, 1024935  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body936 937for.cond.cleanup:                                 ; preds = %for.body938  ret i32 %1939}940 941; CHECK-LABEL: @umax_intrinsic(942; CHECK: <2 x i32> @llvm.umax.v2i32943; CHECK: i32 @llvm.vector.reduce.umax.v2i32944define i32 @umax_intrinsic(ptr nocapture readonly %x) {945entry:946  br label %for.body947 948for.body:                                         ; preds = %entry, %for.body949  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]950  %s.011 = phi i32 [ 100, %entry ], [ %1, %for.body ]951  %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.012952  %0 = load i32, ptr %arrayidx, align 4953  %1 = tail call i32 @llvm.umax.i32(i32 %s.011, i32 %0)954  %inc = add nuw nsw i32 %i.012, 1955  %exitcond.not = icmp eq i32 %inc, 1024956  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body957 958for.cond.cleanup:                                 ; preds = %for.body959  ret i32 %1960}961 962; CHECK-LABEL: @fmin_intrinsic(963; CHECK: nnan nsz <2 x float> @llvm.minnum.v2f32964; CHECK: nnan nsz float @llvm.vector.reduce.fmin.v2f32965define float @fmin_intrinsic(ptr nocapture readonly %x) {966entry:967  br label %for.body968 969for.cond.cleanup:                                 ; preds = %for.body970  ret float %1971 972for.body:                                         ; preds = %entry, %for.body973  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]974  %s.011 = phi float [ 0.000000e+00, %entry ], [ %1, %for.body ]975  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.012976  %0 = load float, ptr %arrayidx, align 4977  %1 = tail call nnan nsz float @llvm.minnum.f32(float %s.011, float %0)978  %inc = add nuw nsw i32 %i.012, 1979  %exitcond.not = icmp eq i32 %inc, 1024980  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body981}982 983; CHECK-LABEL: @fmax_intrinsic(984; CHECK: fast <2 x float> @llvm.maxnum.v2f32985; CHECK: fast float @llvm.vector.reduce.fmax.v2f32986define float @fmax_intrinsic(ptr nocapture readonly %x) {987entry:988  br label %for.body989 990for.cond.cleanup:                                 ; preds = %for.body991  ret float %1992 993for.body:                                         ; preds = %entry, %for.body994  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]995  %s.011 = phi float [ 0.000000e+00, %entry ], [ %1, %for.body ]996  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.012997  %0 = load float, ptr %arrayidx, align 4998  %1 = tail call fast float @llvm.maxnum.f32(float %s.011, float %0)999  %inc = add nuw nsw i32 %i.012, 11000  %exitcond.not = icmp eq i32 %inc, 10241001  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1002}1003 1004; This can be vectorized with additional runtime checks for NaNs.1005; CHECK-LABEL: @fmin_intrinsic_nofast(1006; CHECK: <2 x float> @llvm.minnum.v2f321007; CHECK: fcmp uno <2 x float> [[OP:.+]], [[OP]]1008define float @fmin_intrinsic_nofast(ptr nocapture readonly %x) {1009entry:1010  br label %for.body1011 1012for.cond.cleanup:                                 ; preds = %for.body1013  ret float %11014 1015for.body:                                         ; preds = %entry, %for.body1016  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1017  %s.011 = phi float [ 0.000000e+00, %entry ], [ %1, %for.body ]1018  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.0121019  %0 = load float, ptr %arrayidx, align 41020  %1 = tail call float @llvm.minnum.f32(float %s.011, float %0)1021  %inc = add nuw nsw i32 %i.012, 11022  %exitcond.not = icmp eq i32 %inc, 10241023  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1024}1025 1026; This can be vectorized with additional runtime checks for NaNs.1027; CHECK-LABEL: @fmax_intrinsic_nofast(1028; CHECK: <2 x float> @llvm.maxnum.v2f321029; CHECK: fcmp uno <2 x float> [[OP:.+]], [[OP]]1030define float @fmax_intrinsic_nofast(ptr nocapture readonly %x) {1031entry:1032  br label %for.body1033 1034for.cond.cleanup:                                 ; preds = %for.body1035  ret float %11036 1037for.body:                                         ; preds = %entry, %for.body1038  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1039  %s.011 = phi float [ 0.000000e+00, %entry ], [ %1, %for.body ]1040  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.0121041  %0 = load float, ptr %arrayidx, align 41042  %1 = tail call float @llvm.maxnum.f32(float %s.011, float %0)1043  %inc = add nuw nsw i32 %i.012, 11044  %exitcond.not = icmp eq i32 %inc, 10241045  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1046}1047 1048; CHECK-LABEL: @sminmax(1049; Min and max intrinsics - don't vectorize1050; CHECK-NOT: <2 x i32>1051define i32 @sminmax(ptr nocapture readonly %x, ptr nocapture readonly %y) {1052entry:1053  br label %for.body1054 1055for.cond.cleanup:                                 ; preds = %for.body1056  ret i32 %cond91057 1058for.body:                                         ; preds = %entry, %for.body1059  %i.025 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1060  %s.024 = phi i32 [ 0, %entry ], [ %cond9, %for.body ]1061  %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.0251062  %0 = load i32, ptr %arrayidx, align 41063  %s.0. = tail call i32 @llvm.smin.i32(i32 %s.024, i32 %0)1064  %arrayidx3 = getelementptr inbounds i32, ptr %y, i32 %i.0251065  %1 = load i32, ptr %arrayidx3, align 41066  %cond9 = tail call i32 @llvm.smax.i32(i32 %s.0., i32 %1)1067  %inc = add nuw nsw i32 %i.025, 11068  %exitcond.not = icmp eq i32 %inc, 10241069  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1070}1071 1072; CHECK-LABEL: @sminmin(1073; CHECK: <2 x i32> @llvm.smin.v2i321074; CHECK: <2 x i32> @llvm.smin.v2i321075; CHECK: i32 @llvm.vector.reduce.smin.v2i321076define i32 @sminmin(ptr nocapture readonly %x, ptr nocapture readonly %y) {1077entry:1078  br label %for.body1079 1080for.cond.cleanup:                                 ; preds = %for.body1081  ret i32 %cond91082 1083for.body:                                         ; preds = %entry, %for.body1084  %i.025 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1085  %s.024 = phi i32 [ 0, %entry ], [ %cond9, %for.body ]1086  %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.0251087  %0 = load i32, ptr %arrayidx, align 41088  %s.0. = tail call i32 @llvm.smin.i32(i32 %s.024, i32 %0)1089  %arrayidx3 = getelementptr inbounds i32, ptr %y, i32 %i.0251090  %1 = load i32, ptr %arrayidx3, align 41091  %cond9 = tail call i32 @llvm.smin.i32(i32 %s.0., i32 %1)1092  %inc = add nuw nsw i32 %i.025, 11093  %exitcond.not = icmp eq i32 %inc, 10241094  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1095}1096 1097; CHECK-LABEL: fmaximum_intrinsic1098; CHECK-LABEL: vector.body:1099; CHECK: call <2 x float> @llvm.maximum.v2f321100; CHECK: call <2 x float> @llvm.maximum.v2f321101 1102; CHECK-LABEL: middle.block:1103; CHECK: call <2 x float> @llvm.maximum.v2f321104; CHECK: call float @llvm.vector.reduce.fmaximum.v2f321105define float @fmaximum_intrinsic(ptr nocapture readonly %x) {1106entry:1107  br label %for.body1108 1109for.cond.cleanup:                                 ; preds = %for.body1110  ret float %11111 1112for.body:                                         ; preds = %entry, %for.body1113  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1114  %s.011 = phi float [ 0.000000e+00, %entry ], [ %1, %for.body ]1115  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.0121116  %0 = load float, ptr %arrayidx, align 41117  %1 = tail call float @llvm.maximum.f32(float %s.011, float %0)1118  %inc = add nuw nsw i32 %i.012, 11119  %exitcond.not = icmp eq i32 %inc, 10241120  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1121}1122 1123; CHECK-LABEL: fminimum_intrinsic1124; CHECK-LABEL: vector.body:1125; CHECK: call <2 x float> @llvm.minimum.v2f321126; CHECK: call <2 x float> @llvm.minimum.v2f321127 1128; CHECK-LABEL: middle.block:1129; CHECK: call <2 x float> @llvm.minimum.v2f321130; CHECK: call float @llvm.vector.reduce.fminimum.v2f321131define float @fminimum_intrinsic(ptr nocapture readonly %x) {1132entry:1133  br label %for.body1134 1135for.cond.cleanup:                                 ; preds = %for.body1136  ret float %11137 1138for.body:                                         ; preds = %entry, %for.body1139  %i.012 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1140  %s.011 = phi float [ 0.000000e+00, %entry ], [ %1, %for.body ]1141  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.0121142  %0 = load float, ptr %arrayidx, align 41143  %1 = tail call float @llvm.minimum.f32(float %s.011, float %0)1144  %inc = add nuw nsw i32 %i.012, 11145  %exitcond.not = icmp eq i32 %inc, 10241146  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1147}1148 1149; CHECK-LABEL: fminimum_fminimum1150; CHECK-LABEL: vector.body:1151; CHECK: call <2 x float> @llvm.minimum.v2f321152; CHECK: call <2 x float> @llvm.minimum.v2f321153; CHECK: call <2 x float> @llvm.minimum.v2f321154; CHECK: call <2 x float> @llvm.minimum.v2f321155 1156; CHECK-LABEL: middle.block:1157; CHECK: call <2 x float> @llvm.minimum.v2f321158; CHECK: call float @llvm.vector.reduce.fminimum.v2f321159define float @fminimum_fminimum(ptr nocapture readonly %x, ptr nocapture readonly %y) {1160entry:1161  br label %for.body1162 1163for.cond.cleanup:                                 ; preds = %for.body1164  ret float %cond91165 1166for.body:                                         ; preds = %entry, %for.body1167  %i.025 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1168  %s.011 = phi float [ 0.000000e+00, %entry ], [ %cond9, %for.body ]1169  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.0251170  %0 = load float, ptr %arrayidx, align 41171  %s.0. = tail call float @llvm.minimum.f32(float %s.011, float %0)1172  %arrayidx3 = getelementptr inbounds float, ptr %y, i32 %i.0251173  %1 = load float, ptr %arrayidx3, align 41174  %cond9 = tail call float @llvm.minimum.f32(float %s.0., float %1)1175  %inc = add nuw nsw i32 %i.025, 11176  %exitcond.not = icmp eq i32 %inc, 10241177  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1178}1179 1180; CHECK-LABEL: fminimum_fminimum_one_with_flags1181; CHECK-LABEL: vector.body:1182; CHECK: call nnan nsz <2 x float> @llvm.minimum.v2f321183; CHECK: call nnan nsz <2 x float> @llvm.minimum.v2f321184; CHECK: call <2 x float> @llvm.minimum.v2f321185; CHECK: call <2 x float> @llvm.minimum.v2f321186 1187; CHECK-LABEL: middle.block:1188; CHECK: call <2 x float> @llvm.minimum.v2f321189; CHECK: call float @llvm.vector.reduce.fminimum.v2f321190define float @fminimum_fminimum_one_with_flags(ptr nocapture readonly %x, ptr nocapture readonly %y) {1191entry:1192  br label %for.body1193 1194for.cond.cleanup:                                 ; preds = %for.body1195  ret float %cond91196 1197for.body:                                         ; preds = %entry, %for.body1198  %i.025 = phi i32 [ 0, %entry ], [ %inc, %for.body ]1199  %s.011 = phi float [ 0.000000e+00, %entry ], [ %cond9, %for.body ]1200  %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.0251201  %0 = load float, ptr %arrayidx, align 41202  %s.0. = tail call nnan nsz float @llvm.minimum.f32(float %s.011, float %0)1203  %arrayidx3 = getelementptr inbounds float, ptr %y, i32 %i.0251204  %1 = load float, ptr %arrayidx3, align 41205  %cond9 = tail call float @llvm.minimum.f32(float %s.0., float %1)1206  %inc = add nuw nsw i32 %i.025, 11207  %exitcond.not = icmp eq i32 %inc, 10241208  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1209}1210 1211; Make sure any check-not directives are not triggered by function declarations.1212; CHECK: declare1213 1214declare i32 @llvm.smin.i32(i32, i32)1215declare i32 @llvm.smax.i32(i32, i32)1216declare i32 @llvm.umin.i32(i32, i32)1217declare i32 @llvm.umax.i32(i32, i32)1218declare float @llvm.minnum.f32(float, float)1219declare float @llvm.maxnum.f32(float, float)1220declare float @llvm.minimum.f32(float, float)1221declare float @llvm.maximum.f32(float, float)1222 1223attributes #0 = { "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" }1224attributes #1 = { "no-nans-fp-math"="true" }1225