| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -passes=slp-vectorizer -S -mtriple=aarch64-unknown-linux-gnu -mcpu=olympus < %s | FileCheck %s | |
| define i64 @all_zero_3xi64(ptr %p, i64 %x) { | |
| ; CHECK-LABEL: define i64 @all_zero_3xi64( | |
| ; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P]], i64 8 | |
| ; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 16 | |
| ; CHECK-NEXT: [[W0:%.*]] = load i64, ptr [[P]], align 8 | |
| ; CHECK-NEXT: [[C0:%.*]] = icmp eq i64 [[W0]], 0 | |
| ; CHECK-NEXT: [[W1:%.*]] = load i64, ptr [[P1]], align 8 | |
| ; CHECK-NEXT: [[C1:%.*]] = icmp eq i64 [[W1]], 0 | |
| ; CHECK-NEXT: [[AND0:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false | |
| ; CHECK-NEXT: [[W2:%.*]] = load i64, ptr [[P2]], align 8 | |
| ; CHECK-NEXT: [[C2:%.*]] = icmp eq i64 [[W2]], 0 | |
| ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[AND0]], i1 [[C2]], i1 false | |
| ; CHECK-NEXT: br i1 [[AND1]], label %[[EMPTY:.*]], label %[[COUNT:.*]] | |
| ; CHECK: [[EMPTY]]: | |
| ; CHECK-NEXT: ret i64 0 | |
| ; CHECK: [[COUNT]]: | |
| ; CHECK-NEXT: [[N0:%.*]] = call i64 @llvm.ctpop.i64(i64 [[X]]) | |
| ; CHECK-NEXT: [[N1:%.*]] = call i64 @llvm.ctpop.i64(i64 [[W0]]) | |
| ; CHECK-NEXT: [[OR0:%.*]] = or i64 [[N0]], [[N1]] | |
| ; CHECK-NEXT: [[N2:%.*]] = call i64 @llvm.ctpop.i64(i64 [[X]]) | |
| ; CHECK-NEXT: [[TMP4:%.*]] = or i64 [[OR0]], [[N2]] | |
| ; CHECK-NEXT: ret i64 [[TMP4]] | |
| ; | |
| entry: | |
| %p1 = getelementptr i8, ptr %p, i64 8 | |
| %p2 = getelementptr i8, ptr %p, i64 16 | |
| %w0 = load i64, ptr %p, align 8 | |
| %c0 = icmp eq i64 %w0, 0 | |
| %w1 = load i64, ptr %p1, align 8 | |
| %c1 = icmp eq i64 %w1, 0 | |
| %and0 = select i1 %c0, i1 %c1, i1 false | |
| %w2 = load i64, ptr %p2, align 8 | |
| %c2 = icmp eq i64 %w2, 0 | |
| %and1 = select i1 %and0, i1 %c2, i1 false | |
| br i1 %and1, label %empty, label %count | |
| empty: | |
| ret i64 0 | |
| count: | |
| %n0 = call i64 @llvm.ctpop.i64(i64 %x) | |
| %n1 = call i64 @llvm.ctpop.i64(i64 %w0) | |
| %or0 = or i64 %n0, %n1 | |
| %n2 = call i64 @llvm.ctpop.i64(i64 %x) | |
| %or1 = or i64 %or0, %n2 | |
| ret i64 %or1 | |
| } | |
| declare i64 @llvm.ctpop.i64(i64) |