[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / Transforms / CorrelatedValuePropagation / umax.ll
blob4fca708c183815a6efa35004d707d0e27a1e1f0d
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2 ; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
4 target datalayout = "p:32:32"
6 define i32 @infer_range_from_dom_equality(i32 %x, i32 %y) {
7 ; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality(
8 ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
9 ; CHECK-NEXT:  [[ENTRY:.*:]]
10 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X]], [[Y]]
11 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]
12 ; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
13 ; CHECK:       [[IF_THEN]]:
14 ; CHECK-NEXT:    ret i32 1
15 ; CHECK:       [[IF_ELSE]]:
16 ; CHECK-NEXT:    ret i32 [[SUB]]
18 entry:
19   %cond = icmp eq i32 %x, %y
20   %sub = sub i32 %x, %y
21   br i1 %cond, label %if.then, label %if.else
23 if.then:
24   %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
25   ret i32 %max1
27 if.else:
28   %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
29   ret i32 %max2
32 define i32 @infer_range_from_dom_equality_commuted1(i32 %x, i32 %y) {
33 ; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_commuted1(
34 ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
35 ; CHECK-NEXT:  [[ENTRY:.*:]]
36 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X]], [[Y]]
37 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[Y]], [[X]]
38 ; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
39 ; CHECK:       [[IF_THEN]]:
40 ; CHECK-NEXT:    ret i32 1
41 ; CHECK:       [[IF_ELSE]]:
42 ; CHECK-NEXT:    ret i32 [[SUB]]
44 entry:
45   %cond = icmp eq i32 %x, %y
46   %sub = sub i32 %y, %x
47   br i1 %cond, label %if.then, label %if.else
49 if.then:
50   %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
51   ret i32 %max1
53 if.else:
54   %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
55   ret i32 %max2
58 define i32 @infer_range_from_dom_equality_commuted2(i32 %x, i32 %y) {
59 ; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_commuted2(
60 ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
61 ; CHECK-NEXT:  [[ENTRY:.*:]]
62 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[Y]], [[X]]
63 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]
64 ; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
65 ; CHECK:       [[IF_THEN]]:
66 ; CHECK-NEXT:    ret i32 1
67 ; CHECK:       [[IF_ELSE]]:
68 ; CHECK-NEXT:    ret i32 [[SUB]]
70 entry:
71   %cond = icmp eq i32 %y, %x
72   %sub = sub i32 %x, %y
73   br i1 %cond, label %if.then, label %if.else
75 if.then:
76   %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
77   ret i32 %max1
79 if.else:
80   %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
81   ret i32 %max2
84 define i32 @infer_range_from_dom_equality_ptrdiff(ptr %x, ptr %y) {
85 ; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_ptrdiff(
86 ; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
87 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq ptr [[X]], [[Y]]
88 ; CHECK-NEXT:    [[XI:%.*]] = ptrtoint ptr [[X]] to i32
89 ; CHECK-NEXT:    [[YI:%.*]] = ptrtoint ptr [[Y]] to i32
90 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[XI]], [[YI]]
91 ; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
92 ; CHECK:       [[IF_THEN]]:
93 ; CHECK-NEXT:    ret i32 1
94 ; CHECK:       [[IF_ELSE]]:
95 ; CHECK-NEXT:    ret i32 [[SUB]]
97   %cond = icmp eq ptr %x, %y
98   %xi = ptrtoint ptr %x to i32
99   %yi = ptrtoint ptr %y to i32
100   %sub = sub i32 %xi, %yi
101   br i1 %cond, label %if.then, label %if.else
103 if.then:
104   %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
105   ret i32 %max1
107 if.else:
108   %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
109   ret i32 %max2
112 ; Negative tests
114 define i32 @infer_range_from_dom_slt(i32 %x, i32 %y) {
115 ; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_slt(
116 ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
117 ; CHECK-NEXT:  [[ENTRY:.*:]]
118 ; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[X]], [[Y]]
119 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]
120 ; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
121 ; CHECK:       [[IF_THEN]]:
122 ; CHECK-NEXT:    [[MAX1:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)
123 ; CHECK-NEXT:    ret i32 [[MAX1]]
124 ; CHECK:       [[IF_ELSE]]:
125 ; CHECK-NEXT:    [[MAX2:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)
126 ; CHECK-NEXT:    ret i32 [[MAX2]]
128 entry:
129   %cond = icmp slt i32 %x, %y
130   %sub = sub i32 %x, %y
131   br i1 %cond, label %if.then, label %if.else
133 if.then:
134   %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
135   ret i32 %max1
137 if.else:
138   %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
139   ret i32 %max2
142 define i32 @infer_range_from_dom_equality_not_match(i32 %x, i32 %y, i32 %z) {
143 ; CHECK-LABEL: define range(i32 1, 0) i32 @infer_range_from_dom_equality_not_match(
144 ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
145 ; CHECK-NEXT:  [[ENTRY:.*:]]
146 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X]], [[Z]]
147 ; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[X]], [[Y]]
148 ; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
149 ; CHECK:       [[IF_THEN]]:
150 ; CHECK-NEXT:    [[MAX1:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)
151 ; CHECK-NEXT:    ret i32 [[MAX1]]
152 ; CHECK:       [[IF_ELSE]]:
153 ; CHECK-NEXT:    [[MAX2:%.*]] = call i32 @llvm.umax.i32(i32 [[SUB]], i32 1)
154 ; CHECK-NEXT:    ret i32 [[MAX2]]
156 entry:
157   %cond = icmp eq i32 %x, %z
158   %sub = sub i32 %x, %y
159   br i1 %cond, label %if.then, label %if.else
161 if.then:
162   %max1 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
163   ret i32 %max1
165 if.else:
166   %max2 = call i32 @llvm.umax.i32(i32 %sub, i32 1)
167   ret i32 %max2