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