xref: /llvm-project/llvm/test/Transforms/InstCombine/AMDGPU/mbcnt.ll (revision 5ccfc4543d1784ed98cfae52364e438de5a993a6)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes --version 2
2; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=instcombine < %s | FileCheck --check-prefixes=DEFAULT,CHECK %s
3; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mattr=+wavefrontsize32 -passes=instcombine < %s | FileCheck --check-prefixes=WAVE32,CHECK %s
4; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64 -passes=instcombine < %s | FileCheck --check-prefixes=WAVE64,CHECK %s
5; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 -passes=instcombine < %s | FileCheck --check-prefixes=WAVE32,CHECK %s
6; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 -mattr=+wavefrontsize64 -passes=instcombine < %s | FileCheck --check-prefixes=WAVE64,CHECK %s
7
8declare i32 @llvm.amdgcn.mbcnt.lo(i32, i32)
9declare i32 @llvm.amdgcn.mbcnt.hi(i32, i32)
10
11define i32 @mbcnt_lo(i32 %x, i32 %y) {
12; DEFAULT-LABEL: define i32 @mbcnt_lo
13; DEFAULT-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
14; DEFAULT-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 [[X]], i32 [[Y]])
15; DEFAULT-NEXT:    ret i32 [[LO]]
16;
17; WAVE32-LABEL: define i32 @mbcnt_lo
18; WAVE32-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR1:[0-9]+]] {
19; WAVE32-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 [[X]], i32 [[Y]])
20; WAVE32-NEXT:    ret i32 [[LO]]
21;
22; WAVE64-LABEL: define i32 @mbcnt_lo
23; WAVE64-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR1:[0-9]+]] {
24; WAVE64-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 [[X]], i32 [[Y]])
25; WAVE64-NEXT:    ret i32 [[LO]]
26;
27  %lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 %x, i32 %y)
28  ret i32 %lo
29}
30
31define i32 @mbcnt_hi(i32 %x, i32 %y) {
32; DEFAULT-LABEL: define i32 @mbcnt_hi
33; DEFAULT-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
34; DEFAULT-NEXT:    [[HI:%.*]] = call i32 @llvm.amdgcn.mbcnt.hi(i32 [[X]], i32 [[Y]])
35; DEFAULT-NEXT:    ret i32 [[HI]]
36;
37; WAVE32-LABEL: define i32 @mbcnt_hi
38; WAVE32-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR1]] {
39; WAVE32-NEXT:    ret i32 [[Y]]
40;
41; WAVE64-LABEL: define i32 @mbcnt_hi
42; WAVE64-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR1]] {
43; WAVE64-NEXT:    [[HI:%.*]] = call i32 @llvm.amdgcn.mbcnt.hi(i32 [[X]], i32 [[Y]])
44; WAVE64-NEXT:    ret i32 [[HI]]
45;
46  %hi = call i32 @llvm.amdgcn.mbcnt.hi(i32 %x, i32 %y)
47  ret i32 %hi
48}
49
50define i32 @mbcnt_lo_hi(i32 %x, i32 %y, i32 %z) {
51; DEFAULT-LABEL: define i32 @mbcnt_lo_hi
52; DEFAULT-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
53; DEFAULT-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 [[X]], i32 [[Y]])
54; DEFAULT-NEXT:    [[HI:%.*]] = call i32 @llvm.amdgcn.mbcnt.hi(i32 [[Z]], i32 [[LO]])
55; DEFAULT-NEXT:    ret i32 [[HI]]
56;
57; WAVE32-LABEL: define i32 @mbcnt_lo_hi
58; WAVE32-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) #[[ATTR1]] {
59; WAVE32-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 [[X]], i32 [[Y]])
60; WAVE32-NEXT:    ret i32 [[LO]]
61;
62; WAVE64-LABEL: define i32 @mbcnt_lo_hi
63; WAVE64-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) #[[ATTR1]] {
64; WAVE64-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 [[X]], i32 [[Y]])
65; WAVE64-NEXT:    [[HI:%.*]] = call i32 @llvm.amdgcn.mbcnt.hi(i32 [[Z]], i32 [[LO]])
66; WAVE64-NEXT:    ret i32 [[HI]]
67;
68  %lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 %x, i32 %y)
69  %hi = call i32 @llvm.amdgcn.mbcnt.hi(i32 %z, i32 %lo)
70  ret i32 %hi
71}
72
73define i32 @ockl_lane_u32() {
74; DEFAULT-LABEL: define i32 @ockl_lane_u32() {
75; DEFAULT-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0)
76; DEFAULT-NEXT:    [[HI:%.*]] = call i32 @llvm.amdgcn.mbcnt.hi(i32 -1, i32 [[LO]])
77; DEFAULT-NEXT:    ret i32 [[HI]]
78;
79; WAVE32-LABEL: define i32 @ockl_lane_u32
80; WAVE32-SAME: () #[[ATTR1]] {
81; WAVE32-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0)
82; WAVE32-NEXT:    ret i32 [[LO]]
83;
84; WAVE64-LABEL: define i32 @ockl_lane_u32
85; WAVE64-SAME: () #[[ATTR1]] {
86; WAVE64-NEXT:    [[LO:%.*]] = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0)
87; WAVE64-NEXT:    [[HI:%.*]] = call i32 @llvm.amdgcn.mbcnt.hi(i32 -1, i32 [[LO]])
88; WAVE64-NEXT:    ret i32 [[HI]]
89;
90  %lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0)
91  %hi = call i32 @llvm.amdgcn.mbcnt.hi(i32 -1, i32 %lo)
92  ret i32 %hi
93}
94
95;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
96; CHECK: {{.*}}
97