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