brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · 5f49d6c Raw
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