Skip to content

Commit dddafce

Browse files
[InstCombine] Introduce test for PR149858 (NFC)
1 parent b80ce05 commit dddafce

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3+
4+
define i8 @simple_recurrence_intrinsic(i8 %n, i8 %a, i8 %b) {
5+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic(
6+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: br label %[[LOOP:.*]]
9+
; CHECK: [[LOOP]]:
10+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
11+
; CHECK-NEXT: [[UMAX_ACC:%.*]] = phi i8 [ [[UMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
12+
; CHECK-NEXT: [[UMAX]] = call i8 @llvm.umax.i8(i8 [[UMAX_ACC]], i8 [[B]])
13+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
14+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
15+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
16+
; CHECK: [[EXIT]]:
17+
; CHECK-NEXT: ret i8 [[UMAX]]
18+
;
19+
entry:
20+
br label %loop
21+
22+
loop:
23+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
24+
%umax.acc = phi i8 [ %umax, %loop ], [ %a, %entry ]
25+
%umax = call i8 @llvm.umax.i8(i8 %umax.acc, i8 %b)
26+
%iv.next = add nuw i8 %iv, 1
27+
%cmp = icmp ult i8 %iv.next, %n
28+
br i1 %cmp, label %loop, label %exit
29+
30+
exit:
31+
ret i8 %umax
32+
}
33+
34+
define float @simple_recurrence_intrinsic_2(i32 %n, float %a, float %b) {
35+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_2(
36+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
37+
; CHECK-NEXT: [[ENTRY:.*]]:
38+
; CHECK-NEXT: br label %[[LOOP:.*]]
39+
; CHECK: [[LOOP]]:
40+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
41+
; CHECK-NEXT: [[FMAX_ACC:%.*]] = phi float [ [[FMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
42+
; CHECK-NEXT: [[FMAX]] = call nnan float @llvm.maximum.f32(float [[FMAX_ACC]], float [[B]])
43+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
44+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
45+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
46+
; CHECK: [[EXIT]]:
47+
; CHECK-NEXT: ret float [[FMAX]]
48+
;
49+
entry:
50+
br label %loop
51+
52+
loop:
53+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
54+
%fmax.acc = phi float [ %fmax, %loop ], [ %a, %entry ]
55+
%fmax = call nnan float @llvm.maximum.f32(float %fmax.acc, float %b)
56+
%iv.next = add nuw i32 %iv, 1
57+
%cmp = icmp ult i32 %iv.next, %n
58+
br i1 %cmp, label %loop, label %exit
59+
exit:
60+
ret float %fmax
61+
}
62+
63+
define i8 @simple_recurrence_intrinsic_multiuse_umax(i8 %n, i8 %a, i8 %b) {
64+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_multiuse_umax(
65+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
66+
; CHECK-NEXT: [[ENTRY:.*]]:
67+
; CHECK-NEXT: br label %[[LOOP:.*]]
68+
; CHECK: [[LOOP]]:
69+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
70+
; CHECK-NEXT: [[UMAX_ACC:%.*]] = phi i8 [ [[UMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
71+
; CHECK-NEXT: call void @use(i8 [[UMAX_ACC]])
72+
; CHECK-NEXT: [[UMAX]] = call i8 @llvm.umax.i8(i8 [[UMAX_ACC]], i8 [[B]])
73+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
74+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
75+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
76+
; CHECK: [[EXIT]]:
77+
; CHECK-NEXT: ret i8 [[UMAX]]
78+
;
79+
entry:
80+
br label %loop
81+
82+
loop:
83+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
84+
%umax.acc = phi i8 [ %umax, %loop ], [ %a, %entry ]
85+
call void @use(i8 %umax.acc)
86+
%umax = call i8 @llvm.umax.i8(i8 %umax.acc, i8 %b)
87+
%iv.next = add nuw i8 %iv, 1
88+
%cmp = icmp ult i8 %iv.next, %n
89+
br i1 %cmp, label %loop, label %exit
90+
91+
exit:
92+
ret i8 %umax
93+
}
94+
95+
define i8 @simple_recurrence_intrinsic_arg_loop_variant(i8 %n, i8 %a) {
96+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_arg_loop_variant(
97+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]]) {
98+
; CHECK-NEXT: [[ENTRY:.*]]:
99+
; CHECK-NEXT: br label %[[LOOP:.*]]
100+
; CHECK: [[LOOP]]:
101+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
102+
; CHECK-NEXT: [[UMAX_ACC:%.*]] = phi i8 [ [[UMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
103+
; CHECK-NEXT: [[B:%.*]] = xor i8 [[IV]], 42
104+
; CHECK-NEXT: [[UMAX]] = call i8 @llvm.umax.i8(i8 [[UMAX_ACC]], i8 [[B]])
105+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
106+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
107+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
108+
; CHECK: [[EXIT]]:
109+
; CHECK-NEXT: ret i8 [[UMAX]]
110+
;
111+
entry:
112+
br label %loop
113+
114+
loop:
115+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
116+
%umax.acc = phi i8 [ %umax, %loop ], [ %a, %entry ]
117+
%b = xor i8 %iv, 42
118+
%umax = call i8 @llvm.umax.i8(i8 %umax.acc, i8 %b)
119+
%iv.next = add nuw i8 %iv, 1
120+
%cmp = icmp ult i8 %iv.next, %n
121+
br i1 %cmp, label %loop, label %exit
122+
123+
exit:
124+
ret i8 %umax
125+
}
126+
127+
declare void @use(i8)

0 commit comments

Comments
 (0)