128 lines · plain
1; RUN: opt -passes=loop-idiom -mtriple=amdgcn-- -S < %s | FileCheck %s2 3; Mostly copied from x86 version.4 5;To recognize this pattern:6;int popcount(unsigned long long a) {7; int c = 0;8; while (a) {9; c++;10; a &= a - 1;11; }12; return c;13;}14;15 16; CHECK-LABEL: @popcount_i6417; CHECK: entry18; CHECK: llvm.ctpop.i6419; CHECK: ret20define i32 @popcount_i64(i64 %a) nounwind uwtable readnone ssp {21entry:22 %tobool3 = icmp eq i64 %a, 023 br i1 %tobool3, label %while.end, label %while.body24 25while.body: ; preds = %entry, %while.body26 %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]27 %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ]28 %inc = add nsw i32 %c.05, 129 %sub = add i64 %a.addr.04, -130 %and = and i64 %sub, %a.addr.0431 %tobool = icmp eq i64 %and, 032 br i1 %tobool, label %while.end, label %while.body33 34while.end: ; preds = %while.body, %entry35 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]36 ret i32 %c.0.lcssa37}38 39; CHECK-LABEL: @popcount_i3240; CHECK: entry41; CHECK: llvm.ctpop.i3242; CHECK: ret43define i32 @popcount_i32(i32 %a) nounwind uwtable readnone ssp {44entry:45 %tobool3 = icmp eq i32 %a, 046 br i1 %tobool3, label %while.end, label %while.body47 48while.body: ; preds = %entry, %while.body49 %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]50 %a.addr.04 = phi i32 [ %and, %while.body ], [ %a, %entry ]51 %inc = add nsw i32 %c.05, 152 %sub = add i32 %a.addr.04, -153 %and = and i32 %sub, %a.addr.0454 %tobool = icmp eq i32 %and, 055 br i1 %tobool, label %while.end, label %while.body56 57while.end: ; preds = %while.body, %entry58 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]59 ret i32 %c.0.lcssa60}61 62; CHECK-LABEL: @popcount_i12863; CHECK: entry64; CHECK: llvm.ctpop.i12865; CHECK: ret66define i32 @popcount_i128(i128 %a) nounwind uwtable readnone ssp {67entry:68 %tobool3 = icmp eq i128 %a, 069 br i1 %tobool3, label %while.end, label %while.body70 71while.body: ; preds = %entry, %while.body72 %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]73 %a.addr.04 = phi i128 [ %and, %while.body ], [ %a, %entry ]74 %inc = add nsw i32 %c.05, 175 %sub = add i128 %a.addr.04, -176 %and = and i128 %sub, %a.addr.0477 %tobool = icmp eq i128 %and, 078 br i1 %tobool, label %while.end, label %while.body79 80while.end: ; preds = %while.body, %entry81 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]82 ret i32 %c.0.lcssa83}84 85; To recognize this pattern:86;int popcount(unsigned long long a, int mydata1, int mydata2) {87; int c = 0;88; while (a) {89; c++;90; a &= a - 1;91; mydata1 *= c;92; mydata2 *= (int)a;93; }94; return c + mydata1 + mydata2;95;}96 97; CHECK-LABEL: @popcount298; CHECK: entry99; CHECK: llvm.ctpop.i64100; CHECK: ret101define i32 @popcount2(i64 %a, i32 %mydata1, i32 %mydata2) nounwind uwtable readnone ssp {102entry:103 %tobool9 = icmp eq i64 %a, 0104 br i1 %tobool9, label %while.end, label %while.body105 106while.body: ; preds = %entry, %while.body107 %c.013 = phi i32 [ %inc, %while.body ], [ 0, %entry ]108 %mydata2.addr.012 = phi i32 [ %mul1, %while.body ], [ %mydata2, %entry ]109 %mydata1.addr.011 = phi i32 [ %mul, %while.body ], [ %mydata1, %entry ]110 %a.addr.010 = phi i64 [ %and, %while.body ], [ %a, %entry ]111 %inc = add nsw i32 %c.013, 1112 %sub = add i64 %a.addr.010, -1113 %and = and i64 %sub, %a.addr.010114 %mul = mul nsw i32 %inc, %mydata1.addr.011115 %conv = trunc i64 %and to i32116 %mul1 = mul nsw i32 %conv, %mydata2.addr.012117 %tobool = icmp eq i64 %and, 0118 br i1 %tobool, label %while.end, label %while.body119 120while.end: ; preds = %while.body, %entry121 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]122 %mydata2.addr.0.lcssa = phi i32 [ %mydata2, %entry ], [ %mul1, %while.body ]123 %mydata1.addr.0.lcssa = phi i32 [ %mydata1, %entry ], [ %mul, %while.body ]124 %add = add i32 %mydata2.addr.0.lcssa, %mydata1.addr.0.lcssa125 %add2 = add i32 %add, %c.0.lcssa126 ret i32 %add2127}128