90 lines · plain
1; RUN: opt -S -force-vector-width=2 -force-vector-interleave=1 -passes=loop-vectorize,simplifycfg -verify-loop-info -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s2 3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"4 5; Test no-predication of instructions that are provably safe, e.g. dividing by6; a non-zero constant.7define void @test(ptr nocapture %asd, ptr nocapture %aud,8 ptr nocapture %asr, ptr nocapture %aur,9 ptr nocapture %asd0, ptr nocapture %aud0,10 ptr nocapture %asr0, ptr nocapture %aur011) {12entry:13 br label %for.body14 15for.cond.cleanup: ; preds = %if.end16 ret void17 18; CHECK-LABEL: test19; CHECK: vector.body:20; CHECK: %{{.*}} = sdiv <2 x i32> %{{.*}}, splat (i32 11)21; CHECK: %{{.*}} = udiv <2 x i32> %{{.*}}, splat (i32 13)22; CHECK: %{{.*}} = srem <2 x i32> %{{.*}}, splat (i32 17)23; CHECK: %{{.*}} = urem <2 x i32> %{{.*}}, splat (i32 19)24; CHECK-NOT: %{{.*}} = sdiv <2 x i32> %{{.*}}, <i32 0, i32 0>25; CHECK-NOT: %{{.*}} = udiv <2 x i32> %{{.*}}, <i32 0, i32 0>26; CHECK-NOT: %{{.*}} = srem <2 x i32> %{{.*}}, <i32 0, i32 0>27; CHECK-NOT: %{{.*}} = urem <2 x i32> %{{.*}}, <i32 0, i32 0>28 29for.body: ; preds = %if.end, %entry30 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %if.end ]31 %isd = getelementptr inbounds i32, ptr %asd, i64 %indvars.iv32 %iud = getelementptr inbounds i32, ptr %aud, i64 %indvars.iv33 %isr = getelementptr inbounds i32, ptr %asr, i64 %indvars.iv34 %iur = getelementptr inbounds i32, ptr %aur, i64 %indvars.iv35 %lsd = load i32, ptr %isd, align 436 %lud = load i32, ptr %iud, align 437 %lsr = load i32, ptr %isr, align 438 %lur = load i32, ptr %iur, align 439 %psd = add nsw i32 %lsd, 2340 %pud = add nsw i32 %lud, 2441 %psr = add nsw i32 %lsr, 2542 %pur = add nsw i32 %lur, 2643 %isd0 = getelementptr inbounds i32, ptr %asd0, i64 %indvars.iv44 %iud0 = getelementptr inbounds i32, ptr %aud0, i64 %indvars.iv45 %isr0 = getelementptr inbounds i32, ptr %asr0, i64 %indvars.iv46 %iur0 = getelementptr inbounds i32, ptr %aur0, i64 %indvars.iv47 %lsd0 = load i32, ptr %isd0, align 448 %lud0 = load i32, ptr %iud0, align 449 %lsr0 = load i32, ptr %isr0, align 450 %lur0 = load i32, ptr %iur0, align 451 %psd0 = add nsw i32 %lsd, 2752 %pud0 = add nsw i32 %lud, 2853 %psr0 = add nsw i32 %lsr, 2954 %pur0 = add nsw i32 %lur, 3055 %cmp1 = icmp slt i32 %lsd, 10056 br i1 %cmp1, label %if.then, label %if.end57 58if.then: ; preds = %for.body59 %rsd = sdiv i32 %psd, 1160 %rud = udiv i32 %pud, 1361 %rsr = srem i32 %psr, 1762 %rur = urem i32 %pur, 1963 %rsd0 = sdiv i32 %psd0, 064 %rud0 = udiv i32 %pud0, 065 %rsr0 = srem i32 %psr0, 066 %rur0 = urem i32 %pur0, 067 br label %if.end68 69if.end: ; preds = %if.then, %for.body70 %ysd.0 = phi i32 [ %rsd, %if.then ], [ %psd, %for.body ]71 %yud.0 = phi i32 [ %rud, %if.then ], [ %pud, %for.body ]72 %ysr.0 = phi i32 [ %rsr, %if.then ], [ %psr, %for.body ]73 %yur.0 = phi i32 [ %rur, %if.then ], [ %pur, %for.body ]74 %ysd0.0 = phi i32 [ %rsd0, %if.then ], [ %psd0, %for.body ]75 %yud0.0 = phi i32 [ %rud0, %if.then ], [ %pud0, %for.body ]76 %ysr0.0 = phi i32 [ %rsr0, %if.then ], [ %psr0, %for.body ]77 %yur0.0 = phi i32 [ %rur0, %if.then ], [ %pur0, %for.body ]78 store i32 %ysd.0, ptr %isd, align 479 store i32 %yud.0, ptr %iud, align 480 store i32 %ysr.0, ptr %isr, align 481 store i32 %yur.0, ptr %iur, align 482 store i32 %ysd0.0, ptr %isd0, align 483 store i32 %yud0.0, ptr %iud0, align 484 store i32 %ysr0.0, ptr %isr0, align 485 store i32 %yur0.0, ptr %iur0, align 486 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 187 %exitcond = icmp eq i64 %indvars.iv.next, 12888 br i1 %exitcond, label %for.cond.cleanup, label %for.body89}90