brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · dd3a4d9 Raw
106 lines · plain
1; RUN: opt -passes=loop-idiom -mtriple=spirv32-- -S < %s | FileCheck %s2; RUN: opt -passes=loop-idiom -mtriple=spirv64-- -S < %s | FileCheck %s3 4; Mostly copied from x86 version.5 6;To recognize this pattern:7;int popcount(unsigned long long a) {8;    int c = 0;9;    while (a) {10;        c++;11;        a &= a - 1;12;    }13;    return c;14;}15;16 17; CHECK-LABEL: @popcount_i6418; CHECK: entry19; CHECK: llvm.ctpop.i6420; CHECK: ret21define i32 @popcount_i64(i64 %a) nounwind uwtable readnone ssp {22entry:23  %tobool3 = icmp eq i64 %a, 024  br i1 %tobool3, label %while.end, label %while.body25 26while.body:                                       ; preds = %entry, %while.body27  %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]28  %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ]29  %inc = add nsw i32 %c.05, 130  %sub = add i64 %a.addr.04, -131  %and = and i64 %sub, %a.addr.0432  %tobool = icmp eq i64 %and, 033  br i1 %tobool, label %while.end, label %while.body34 35while.end:                                        ; preds = %while.body, %entry36  %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]37  ret i32 %c.0.lcssa38}39 40; CHECK-LABEL: @popcount_i3241; CHECK: entry42; CHECK: llvm.ctpop.i3243; CHECK: ret44define i32 @popcount_i32(i32 %a) nounwind uwtable readnone ssp {45entry:46  %tobool3 = icmp eq i32 %a, 047  br i1 %tobool3, label %while.end, label %while.body48 49while.body:                                       ; preds = %entry, %while.body50  %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]51  %a.addr.04 = phi i32 [ %and, %while.body ], [ %a, %entry ]52  %inc = add nsw i32 %c.05, 153  %sub = add i32 %a.addr.04, -154  %and = and i32 %sub, %a.addr.0455  %tobool = icmp eq i32 %and, 056  br i1 %tobool, label %while.end, label %while.body57 58while.end:                                        ; preds = %while.body, %entry59  %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]60  ret i32 %c.0.lcssa61}62 63; To recognize this pattern:64;int popcount(unsigned long long a, int mydata1, int mydata2) {65;    int c = 0;66;    while (a) {67;        c++;68;        a &= a - 1;69;        mydata1 *= c;70;        mydata2 *= (int)a;71;    }72;    return c + mydata1 + mydata2;73;}74 75; CHECK-LABEL: @popcount276; CHECK: entry77; CHECK: llvm.ctpop.i6478; CHECK: ret79define i32 @popcount2(i64 %a, i32 %mydata1, i32 %mydata2) nounwind uwtable readnone ssp {80entry:81  %tobool9 = icmp eq i64 %a, 082  br i1 %tobool9, label %while.end, label %while.body83 84while.body:                                       ; preds = %entry, %while.body85  %c.013 = phi i32 [ %inc, %while.body ], [ 0, %entry ]86  %mydata2.addr.012 = phi i32 [ %mul1, %while.body ], [ %mydata2, %entry ]87  %mydata1.addr.011 = phi i32 [ %mul, %while.body ], [ %mydata1, %entry ]88  %a.addr.010 = phi i64 [ %and, %while.body ], [ %a, %entry ]89  %inc = add nsw i32 %c.013, 190  %sub = add i64 %a.addr.010, -191  %and = and i64 %sub, %a.addr.01092  %mul = mul nsw i32 %inc, %mydata1.addr.01193  %conv = trunc i64 %and to i3294  %mul1 = mul nsw i32 %conv, %mydata2.addr.01295  %tobool = icmp eq i64 %and, 096  br i1 %tobool, label %while.end, label %while.body97 98while.end:                                        ; preds = %while.body, %entry99  %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]100  %mydata2.addr.0.lcssa = phi i32 [ %mydata2, %entry ], [ %mul1, %while.body ]101  %mydata1.addr.0.lcssa = phi i32 [ %mydata1, %entry ], [ %mul, %while.body ]102  %add = add i32 %mydata2.addr.0.lcssa, %mydata1.addr.0.lcssa103  %add2 = add i32 %add, %c.0.lcssa104  ret i32 %add2105}106