blob: 844bb4d6443aa389830363737299aadfd3a881ba [file] [log] [blame]
Nikita Popov8758e142020-06-28 16:16:35 +02001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Nikita Popova59dc552020-07-01 23:35:06 +02002; RUN: opt < %s -instsimplify -S | FileCheck %s
Nikita Popov8758e142020-06-28 16:16:35 +02003
4declare void @llvm.assume(i1)
5declare void @use(i1)
6
7define void @basic_ugt(i32 %x, i32 %y) {
8; CHECK-LABEL: @basic_ugt(
9; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
10; CHECK-NEXT: call void @llvm.assume(i1 [[CMP1]])
11; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[X]], [[Y]]
12; CHECK-NEXT: call void @use(i1 [[CMP2]])
13; CHECK-NEXT: [[CMP3:%.*]] = icmp uge i32 [[X]], [[Y]]
14; CHECK-NEXT: call void @use(i1 [[CMP3]])
15; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[X]], [[Y]]
16; CHECK-NEXT: call void @use(i1 [[CMP4]])
17; CHECK-NEXT: [[CMP5:%.*]] = icmp ule i32 [[X]], [[Y]]
18; CHECK-NEXT: call void @use(i1 [[CMP5]])
19; CHECK-NEXT: [[CMP6:%.*]] = icmp ugt i32 [[Y]], [[X]]
20; CHECK-NEXT: call void @use(i1 [[CMP6]])
21; CHECK-NEXT: [[CMP7:%.*]] = icmp uge i32 [[Y]], [[X]]
22; CHECK-NEXT: call void @use(i1 [[CMP7]])
23; CHECK-NEXT: [[CMP8:%.*]] = icmp ult i32 [[Y]], [[X]]
24; CHECK-NEXT: call void @use(i1 [[CMP8]])
25; CHECK-NEXT: [[CMP9:%.*]] = icmp ule i32 [[Y]], [[X]]
26; CHECK-NEXT: call void @use(i1 [[CMP9]])
27; CHECK-NEXT: ret void
28;
29 %cmp1 = icmp ugt i32 %x, %y
30 call void @llvm.assume(i1 %cmp1)
31
32 %cmp2 = icmp ugt i32 %x, %y
33 call void @use(i1 %cmp2)
34 %cmp3 = icmp uge i32 %x, %y
35 call void @use(i1 %cmp3)
36 %cmp4 = icmp ult i32 %x, %y
37 call void @use(i1 %cmp4)
38 %cmp5 = icmp ule i32 %x, %y
39 call void @use(i1 %cmp5)
40
41 %cmp6 = icmp ugt i32 %y, %x
42 call void @use(i1 %cmp6)
43 %cmp7 = icmp uge i32 %y, %x
44 call void @use(i1 %cmp7)
45 %cmp8 = icmp ult i32 %y, %x
46 call void @use(i1 %cmp8)
47 %cmp9 = icmp ule i32 %y, %x
48 call void @use(i1 %cmp9)
49
50 ret void
51}
52
53define void @basic_uge(i32 %x, i32 %y) {
54; CHECK-LABEL: @basic_uge(
55; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i32 [[X:%.*]], [[Y:%.*]]
56; CHECK-NEXT: call void @llvm.assume(i1 [[CMP1]])
57; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[X]], [[Y]]
58; CHECK-NEXT: call void @use(i1 [[CMP2]])
59; CHECK-NEXT: [[CMP3:%.*]] = icmp uge i32 [[X]], [[Y]]
60; CHECK-NEXT: call void @use(i1 [[CMP3]])
61; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[X]], [[Y]]
62; CHECK-NEXT: call void @use(i1 [[CMP4]])
63; CHECK-NEXT: [[CMP5:%.*]] = icmp ule i32 [[X]], [[Y]]
64; CHECK-NEXT: call void @use(i1 [[CMP5]])
65; CHECK-NEXT: [[CMP6:%.*]] = icmp ugt i32 [[Y]], [[X]]
66; CHECK-NEXT: call void @use(i1 [[CMP6]])
67; CHECK-NEXT: [[CMP7:%.*]] = icmp uge i32 [[Y]], [[X]]
68; CHECK-NEXT: call void @use(i1 [[CMP7]])
69; CHECK-NEXT: [[CMP8:%.*]] = icmp ult i32 [[Y]], [[X]]
70; CHECK-NEXT: call void @use(i1 [[CMP8]])
71; CHECK-NEXT: [[CMP9:%.*]] = icmp ule i32 [[Y]], [[X]]
72; CHECK-NEXT: call void @use(i1 [[CMP9]])
73; CHECK-NEXT: ret void
74;
75 %cmp1 = icmp uge i32 %x, %y
76 call void @llvm.assume(i1 %cmp1)
77
78 %cmp2 = icmp ugt i32 %x, %y
79 call void @use(i1 %cmp2)
80 %cmp3 = icmp uge i32 %x, %y
81 call void @use(i1 %cmp3)
82 %cmp4 = icmp ult i32 %x, %y
83 call void @use(i1 %cmp4)
84 %cmp5 = icmp ule i32 %x, %y
85 call void @use(i1 %cmp5)
86
87 %cmp6 = icmp ugt i32 %y, %x
88 call void @use(i1 %cmp6)
89 %cmp7 = icmp uge i32 %y, %x
90 call void @use(i1 %cmp7)
91 %cmp8 = icmp ult i32 %y, %x
92 call void @use(i1 %cmp8)
93 %cmp9 = icmp ule i32 %y, %x
94 call void @use(i1 %cmp9)
95
96 ret void
97}
98
99define void @and(i32 %x, i32 %y, i32 %z) {
100; CHECK-LABEL: @and(
101; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
102; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[Z:%.*]], [[Y]]
Nikita Popova59dc552020-07-01 23:35:06 +0200103; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
104; CHECK-NEXT: call void @llvm.assume(i1 [[AND]])
Nikita Popov8758e142020-06-28 16:16:35 +0200105; CHECK-NEXT: [[CMP3:%.*]] = icmp ugt i32 [[X]], [[Y]]
106; CHECK-NEXT: call void @use(i1 [[CMP3]])
107; CHECK-NEXT: [[CMP4:%.*]] = icmp uge i32 [[X]], [[Y]]
108; CHECK-NEXT: call void @use(i1 [[CMP4]])
109; CHECK-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[Z]], [[Y]]
110; CHECK-NEXT: call void @use(i1 [[CMP5]])
111; CHECK-NEXT: [[CMP6:%.*]] = icmp uge i32 [[Z]], [[Y]]
112; CHECK-NEXT: call void @use(i1 [[CMP6]])
113; CHECK-NEXT: ret void
114;
115 %cmp1 = icmp ugt i32 %x, %y
116 %cmp2 = icmp ugt i32 %z, %y
117 %and = and i1 %cmp1, %cmp2
118 call void @llvm.assume(i1 %and)
119
120 %cmp3 = icmp ugt i32 %x, %y
121 call void @use(i1 %cmp3)
122 %cmp4 = icmp uge i32 %x, %y
123 call void @use(i1 %cmp4)
124 %cmp5 = icmp ugt i32 %z, %y
125 call void @use(i1 %cmp5)
126 %cmp6 = icmp uge i32 %z, %y
127 call void @use(i1 %cmp6)
128
129 ret void
130}