1de0d27c1SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2de0d27c1SYingwei Zheng; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3de0d27c1SYingwei Zheng 4de0d27c1SYingwei Zheng; Test from PR63896 5de0d27c1SYingwei Zhengdefine i1 @umax_ugt(i32 %x, i32 %y) { 6de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_ugt 7de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 8de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1) 9de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[Y]], [[MAX]] 10de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 11de0d27c1SYingwei Zheng; CHECK: if: 1292a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 true, true 13de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 14de0d27c1SYingwei Zheng; CHECK: end: 15de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 16de0d27c1SYingwei Zheng; 17de0d27c1SYingwei Zheng %max = call i32 @llvm.umax.i32(i32 %x, i32 1) 18de0d27c1SYingwei Zheng %cmp = icmp ugt i32 %y, %max 19de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 20de0d27c1SYingwei Zheng 21de0d27c1SYingwei Zhengif: 22de0d27c1SYingwei Zheng %cmp2 = icmp ugt i32 %y, %x 23de0d27c1SYingwei Zheng %cmp3 = icmp uge i32 %y, %x 24de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 25de0d27c1SYingwei Zheng ret i1 %ret 26de0d27c1SYingwei Zheng 27de0d27c1SYingwei Zhengend: 28de0d27c1SYingwei Zheng ret i1 false 29de0d27c1SYingwei Zheng} 30de0d27c1SYingwei Zheng 31de0d27c1SYingwei Zhengdefine i1 @umax_uge(i32 %x, i32 %y) { 32de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_uge 33de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 34de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1) 35de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[Y]], [[MAX]] 36de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 37de0d27c1SYingwei Zheng; CHECK: if: 38de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[Y]], [[X]] 3992a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 [[CMP2]], true 40de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 41de0d27c1SYingwei Zheng; CHECK: end: 42de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 43de0d27c1SYingwei Zheng; 44de0d27c1SYingwei Zheng %max = call i32 @llvm.umax.i32(i32 %x, i32 1) 45de0d27c1SYingwei Zheng %cmp = icmp uge i32 %y, %max 46de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 47de0d27c1SYingwei Zheng 48de0d27c1SYingwei Zhengif: 49de0d27c1SYingwei Zheng %cmp2 = icmp ugt i32 %y, %x 50de0d27c1SYingwei Zheng %cmp3 = icmp uge i32 %y, %x 51de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 52de0d27c1SYingwei Zheng ret i1 %ret 53de0d27c1SYingwei Zheng 54de0d27c1SYingwei Zhengend: 55de0d27c1SYingwei Zheng ret i1 false 56de0d27c1SYingwei Zheng} 57de0d27c1SYingwei Zheng 58de0d27c1SYingwei Zhengdefine i1 @umin_ult(i32 %x, i32 %y) { 59de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umin_ult 60de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 61de0d27c1SYingwei Zheng; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[X]], i32 1) 62de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[Y]], [[MIN]] 63de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 64de0d27c1SYingwei Zheng; CHECK: if: 6592a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 true, true 66de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 67de0d27c1SYingwei Zheng; CHECK: end: 68de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 69de0d27c1SYingwei Zheng; 70de0d27c1SYingwei Zheng %min = call i32 @llvm.umin.i32(i32 %x, i32 1) 71de0d27c1SYingwei Zheng %cmp = icmp ult i32 %y, %min 72de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 73de0d27c1SYingwei Zheng 74de0d27c1SYingwei Zhengif: 75de0d27c1SYingwei Zheng %cmp2 = icmp ult i32 %y, %x 76de0d27c1SYingwei Zheng %cmp3 = icmp ule i32 %y, %x 77de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 78de0d27c1SYingwei Zheng ret i1 %ret 79de0d27c1SYingwei Zheng 80de0d27c1SYingwei Zhengend: 81de0d27c1SYingwei Zheng ret i1 false 82de0d27c1SYingwei Zheng} 83de0d27c1SYingwei Zheng 84de0d27c1SYingwei Zhengdefine i1 @umin_ule(i32 %x, i32 %y) { 85de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umin_ule 86de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 87de0d27c1SYingwei Zheng; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[X]], i32 1) 88de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[Y]], [[MIN]] 89de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 90de0d27c1SYingwei Zheng; CHECK: if: 91de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[Y]], [[X]] 9292a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 [[CMP2]], true 93de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 94de0d27c1SYingwei Zheng; CHECK: end: 95de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 96de0d27c1SYingwei Zheng; 97de0d27c1SYingwei Zheng %min = call i32 @llvm.umin.i32(i32 %x, i32 1) 98de0d27c1SYingwei Zheng %cmp = icmp ule i32 %y, %min 99de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 100de0d27c1SYingwei Zheng 101de0d27c1SYingwei Zhengif: 102de0d27c1SYingwei Zheng %cmp2 = icmp ult i32 %y, %x 103de0d27c1SYingwei Zheng %cmp3 = icmp ule i32 %y, %x 104de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 105de0d27c1SYingwei Zheng ret i1 %ret 106de0d27c1SYingwei Zheng 107de0d27c1SYingwei Zhengend: 108de0d27c1SYingwei Zheng ret i1 false 109de0d27c1SYingwei Zheng} 110de0d27c1SYingwei Zheng 111de0d27c1SYingwei Zhengdefine i1 @smax_sgt(i32 %x, i32 %y) { 112de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smax_sgt 113de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 114de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1) 115de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[Y]], [[MAX]] 116de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 117de0d27c1SYingwei Zheng; CHECK: if: 11892a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 true, true 119de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 120de0d27c1SYingwei Zheng; CHECK: end: 121de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 122de0d27c1SYingwei Zheng; 123de0d27c1SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %x, i32 1) 124de0d27c1SYingwei Zheng %cmp = icmp sgt i32 %y, %max 125de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 126de0d27c1SYingwei Zheng 127de0d27c1SYingwei Zhengif: 128de0d27c1SYingwei Zheng %cmp2 = icmp sgt i32 %y, %x 129de0d27c1SYingwei Zheng %cmp3 = icmp sge i32 %y, %x 130de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 131de0d27c1SYingwei Zheng ret i1 %ret 132de0d27c1SYingwei Zheng 133de0d27c1SYingwei Zhengend: 134de0d27c1SYingwei Zheng ret i1 false 135de0d27c1SYingwei Zheng} 136de0d27c1SYingwei Zheng 137de0d27c1SYingwei Zhengdefine i1 @smax_sge(i32 %x, i32 %y) { 138de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smax_sge 139de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 140de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1) 141de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[Y]], [[MAX]] 142de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 143de0d27c1SYingwei Zheng; CHECK: if: 144de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[Y]], [[X]] 14592a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 [[CMP2]], true 146de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 147de0d27c1SYingwei Zheng; CHECK: end: 148de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 149de0d27c1SYingwei Zheng; 150de0d27c1SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %x, i32 1) 151de0d27c1SYingwei Zheng %cmp = icmp sge i32 %y, %max 152de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 153de0d27c1SYingwei Zheng 154de0d27c1SYingwei Zhengif: 155de0d27c1SYingwei Zheng %cmp2 = icmp sgt i32 %y, %x 156de0d27c1SYingwei Zheng %cmp3 = icmp sge i32 %y, %x 157de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 158de0d27c1SYingwei Zheng ret i1 %ret 159de0d27c1SYingwei Zheng 160de0d27c1SYingwei Zhengend: 161de0d27c1SYingwei Zheng ret i1 false 162de0d27c1SYingwei Zheng} 163de0d27c1SYingwei Zheng 164de0d27c1SYingwei Zhengdefine i1 @smin_slt(i32 %x, i32 %y) { 165de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_slt 166de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 167de0d27c1SYingwei Zheng; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 1) 168de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[Y]], [[MIN]] 169de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 170de0d27c1SYingwei Zheng; CHECK: if: 17192a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 true, true 172de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 173de0d27c1SYingwei Zheng; CHECK: end: 174de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 175de0d27c1SYingwei Zheng; 176de0d27c1SYingwei Zheng %min = call i32 @llvm.smin.i32(i32 %x, i32 1) 177de0d27c1SYingwei Zheng %cmp = icmp slt i32 %y, %min 178de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 179de0d27c1SYingwei Zheng 180de0d27c1SYingwei Zhengif: 181de0d27c1SYingwei Zheng %cmp2 = icmp slt i32 %y, %x 182de0d27c1SYingwei Zheng %cmp3 = icmp sle i32 %y, %x 183de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 184de0d27c1SYingwei Zheng ret i1 %ret 185de0d27c1SYingwei Zheng 186de0d27c1SYingwei Zhengend: 187de0d27c1SYingwei Zheng ret i1 false 188de0d27c1SYingwei Zheng} 189de0d27c1SYingwei Zheng 190de0d27c1SYingwei Zhengdefine i1 @smin_sle(i32 %x, i32 %y) { 191de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_sle 192de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 193de0d27c1SYingwei Zheng; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 1) 194de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[Y]], [[MIN]] 195de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 196de0d27c1SYingwei Zheng; CHECK: if: 197de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[Y]], [[X]] 19892a11eb3SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 [[CMP2]], true 199de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 200de0d27c1SYingwei Zheng; CHECK: end: 201de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 202de0d27c1SYingwei Zheng; 203de0d27c1SYingwei Zheng %min = call i32 @llvm.smin.i32(i32 %x, i32 1) 204de0d27c1SYingwei Zheng %cmp = icmp sle i32 %y, %min 205de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 206de0d27c1SYingwei Zheng 207de0d27c1SYingwei Zhengif: 208de0d27c1SYingwei Zheng %cmp2 = icmp slt i32 %y, %x 209de0d27c1SYingwei Zheng %cmp3 = icmp sle i32 %y, %x 210de0d27c1SYingwei Zheng %ret = xor i1 %cmp2, %cmp3 211de0d27c1SYingwei Zheng ret i1 %ret 212de0d27c1SYingwei Zheng 213de0d27c1SYingwei Zhengend: 214de0d27c1SYingwei Zheng ret i1 false 215de0d27c1SYingwei Zheng} 216de0d27c1SYingwei Zheng 217de0d27c1SYingwei Zhengdefine i1 @umax_uge_ugt_with_add_nuw(i32 %x, i32 %y) { 218de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_uge_ugt_with_add_nuw 219de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 220de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1) 221de0d27c1SYingwei Zheng; CHECK-NEXT: [[SUM:%.*]] = add nuw i32 [[MAX]], 1 222de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[Y]], [[SUM]] 223de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 224de0d27c1SYingwei Zheng; CHECK: if: 22592a11eb3SYingwei Zheng; CHECK-NEXT: ret i1 true 226de0d27c1SYingwei Zheng; CHECK: end: 227de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 228de0d27c1SYingwei Zheng; 229de0d27c1SYingwei Zheng %max = call i32 @llvm.umax.i32(i32 %x, i32 1) 230de0d27c1SYingwei Zheng %sum = add nuw i32 %max, 1 231de0d27c1SYingwei Zheng %cmp = icmp uge i32 %y, %sum 232de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 233de0d27c1SYingwei Zheng 234de0d27c1SYingwei Zhengif: 235de0d27c1SYingwei Zheng %cmp2 = icmp ugt i32 %y, %x 236de0d27c1SYingwei Zheng ret i1 %cmp2 237de0d27c1SYingwei Zheng 238de0d27c1SYingwei Zhengend: 239de0d27c1SYingwei Zheng ret i1 false 240de0d27c1SYingwei Zheng} 241de0d27c1SYingwei Zheng 242de0d27c1SYingwei Zhengdefine i1 @smin_ule_mixed(i32 %x, i32 %y) { 243de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_ule_mixed 244de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 245de0d27c1SYingwei Zheng; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 1) 246de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[Y]], [[MIN]] 247de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 248de0d27c1SYingwei Zheng; CHECK: if: 249de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[Y]], [[X]] 250de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[Y]], [[X]] 251de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[Y]], [[X]] 252de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP5:%.*]] = icmp ule i32 [[Y]], [[X]] 253de0d27c1SYingwei Zheng; CHECK-NEXT: [[XOR1:%.*]] = xor i1 [[CMP2]], [[CMP3]] 254de0d27c1SYingwei Zheng; CHECK-NEXT: [[XOR2:%.*]] = xor i1 [[CMP4]], [[CMP5]] 255de0d27c1SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = xor i1 [[XOR1]], [[XOR2]] 256de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 257de0d27c1SYingwei Zheng; CHECK: end: 258de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 259de0d27c1SYingwei Zheng; 260de0d27c1SYingwei Zheng %min = call i32 @llvm.smin.i32(i32 %x, i32 1) 261de0d27c1SYingwei Zheng %cmp = icmp ule i32 %y, %min 262de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 263de0d27c1SYingwei Zheng 264de0d27c1SYingwei Zhengif: 265de0d27c1SYingwei Zheng %cmp2 = icmp slt i32 %y, %x 266de0d27c1SYingwei Zheng %cmp3 = icmp sle i32 %y, %x 267de0d27c1SYingwei Zheng %cmp4 = icmp ult i32 %y, %x 268de0d27c1SYingwei Zheng %cmp5 = icmp ule i32 %y, %x 269de0d27c1SYingwei Zheng %xor1 = xor i1 %cmp2, %cmp3 270de0d27c1SYingwei Zheng %xor2 = xor i1 %cmp4, %cmp5 271de0d27c1SYingwei Zheng %ret = xor i1 %xor1, %xor2 272de0d27c1SYingwei Zheng ret i1 %ret 273de0d27c1SYingwei Zheng 274de0d27c1SYingwei Zhengend: 275de0d27c1SYingwei Zheng ret i1 false 276de0d27c1SYingwei Zheng} 277de0d27c1SYingwei Zheng 278de0d27c1SYingwei Zhengdefine i1 @umax_ugt_ugt_both(i32 %x, i32 %y, i32 %z) { 279de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @umax_ugt_ugt_both 280de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) { 281de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 [[Y]]) 282de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[Z]], [[MAX]] 283de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 284de0d27c1SYingwei Zheng; CHECK: if: 28592a11eb3SYingwei Zheng; CHECK-NEXT: [[AND:%.*]] = xor i1 true, true 286de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[AND]] 287de0d27c1SYingwei Zheng; CHECK: end: 288de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 false 289de0d27c1SYingwei Zheng; 290de0d27c1SYingwei Zheng %max = call i32 @llvm.umax.i32(i32 %x, i32 %y) 291de0d27c1SYingwei Zheng %cmp = icmp ugt i32 %z, %max 292de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 293de0d27c1SYingwei Zheng 294de0d27c1SYingwei Zhengif: 295de0d27c1SYingwei Zheng %cmp2 = icmp ugt i32 %z, %x 296de0d27c1SYingwei Zheng %cmp3 = icmp ugt i32 %z, %y 297de0d27c1SYingwei Zheng %and = xor i1 %cmp2, %cmp3 298de0d27c1SYingwei Zheng ret i1 %and 299de0d27c1SYingwei Zheng 300de0d27c1SYingwei Zhengend: 301de0d27c1SYingwei Zheng ret i1 false 302de0d27c1SYingwei Zheng} 303de0d27c1SYingwei Zheng 304de0d27c1SYingwei Zhengdefine i1 @smin_branchless(i32 %x, i32 %y) { 305de0d27c1SYingwei Zheng; CHECK-LABEL: define i1 @smin_branchless 306de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) { 307de0d27c1SYingwei Zheng; CHECK-NEXT: entry: 308de0d27c1SYingwei Zheng; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y]]) 3093d91d961SFlorian Hahn; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i32 [[MIN]], [[X]] 3103d91d961SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[MIN]], [[X]] 3113d91d961SFlorian Hahn; CHECK-NEXT: [[RET:%.*]] = xor i1 [[CMP1]], [[CMP2]] 312de0d27c1SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 313de0d27c1SYingwei Zheng; 314de0d27c1SYingwei Zhengentry: 315de0d27c1SYingwei Zheng %min = call i32 @llvm.smin.i32(i32 %x, i32 %y) 316de0d27c1SYingwei Zheng %cmp1 = icmp sle i32 %min, %x 317de0d27c1SYingwei Zheng %cmp2 = icmp sgt i32 %min, %x 318de0d27c1SYingwei Zheng %ret = xor i1 %cmp1, %cmp2 319de0d27c1SYingwei Zheng ret i1 %ret 320de0d27c1SYingwei Zheng} 321de0d27c1SYingwei Zheng 322de0d27c1SYingwei Zhengdefine i32 @simplify_smax(i32 %x, i32 %y, i32 %z) { 323de0d27c1SYingwei Zheng; CHECK-LABEL: define i32 @simplify_smax 324de0d27c1SYingwei Zheng; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) { 325de0d27c1SYingwei Zheng; CHECK-NEXT: entry: 326de0d27c1SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X]], [[Y]] 327de0d27c1SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] 328de0d27c1SYingwei Zheng; CHECK: if: 329de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX1:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 [[Z]]) 330de0d27c1SYingwei Zheng; CHECK-NEXT: [[MAX2:%.*]] = call i32 @llvm.smax.i32(i32 [[Y]], i32 [[MAX1]]) 331de0d27c1SYingwei Zheng; CHECK-NEXT: ret i32 [[MAX2]] 332de0d27c1SYingwei Zheng; CHECK: end: 333de0d27c1SYingwei Zheng; CHECK-NEXT: ret i32 0 334de0d27c1SYingwei Zheng; 335de0d27c1SYingwei Zhengentry: 336de0d27c1SYingwei Zheng %cmp = icmp slt i32 %x, %y 337de0d27c1SYingwei Zheng br i1 %cmp, label %if, label %end 338de0d27c1SYingwei Zhengif: 339de0d27c1SYingwei Zheng %max1 = call i32 @llvm.smax.i32(i32 %x, i32 %z) 340de0d27c1SYingwei Zheng %max2 = call i32 @llvm.smax.i32(i32 %y, i32 %max1) 341de0d27c1SYingwei Zheng ret i32 %max2 342de0d27c1SYingwei Zhengend: 343de0d27c1SYingwei Zheng ret i32 0 344de0d27c1SYingwei Zheng} 345de0d27c1SYingwei Zheng 346bc9c2be3SYingwei Zheng; Test from PR75155 347bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val(i32 %a, i32 %b) { 348bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val 349bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 350bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 351bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 352bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 353bc9c2be3SYingwei Zheng; CHECK: then: 354bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 355bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[B]] 356bc9c2be3SYingwei Zheng; CHECK: else: 357bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 358bc9c2be3SYingwei Zheng; 359bc9c2be3SYingwei Zhengstart: 360bc9c2be3SYingwei Zheng %cmp = icmp slt i32 %a, %b 361bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 362bc9c2be3SYingwei Zhengthen: 363bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 364bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %b, i32 %add) 365bc9c2be3SYingwei Zheng ret i32 %max 366bc9c2be3SYingwei Zhengelse: 367bc9c2be3SYingwei Zheng ret i32 -1 368bc9c2be3SYingwei Zheng} 369bc9c2be3SYingwei Zheng 370bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val_commuted(i32 %a, i32 %b) { 371bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val_commuted 372bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 373bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 374bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 375bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 376bc9c2be3SYingwei Zheng; CHECK: then: 377bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 378bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[B]] 379bc9c2be3SYingwei Zheng; CHECK: else: 380bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 381bc9c2be3SYingwei Zheng; 382bc9c2be3SYingwei Zhengstart: 383bc9c2be3SYingwei Zheng %cmp = icmp slt i32 %a, %b 384bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 385bc9c2be3SYingwei Zhengthen: 386bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 387bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %add, i32 %b) 388bc9c2be3SYingwei Zheng ret i32 %max 389bc9c2be3SYingwei Zhengelse: 390bc9c2be3SYingwei Zheng ret i32 -1 391bc9c2be3SYingwei Zheng} 392bc9c2be3SYingwei Zheng 393bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val_at_use(i32 %a, i32 %b) { 394bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val_at_use 395bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 396bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 397bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 398bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 399bc9c2be3SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]]) 400bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 401bc9c2be3SYingwei Zheng; CHECK: then: 402bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[MAX]] 403bc9c2be3SYingwei Zheng; CHECK: else: 404bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 405bc9c2be3SYingwei Zheng; 406bc9c2be3SYingwei Zhengstart: 407bc9c2be3SYingwei Zheng %cmp = icmp slt i32 %a, %b 408bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 409bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %b, i32 %add) 410bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 411bc9c2be3SYingwei Zhengthen: 412bc9c2be3SYingwei Zheng ret i32 %max 413bc9c2be3SYingwei Zhengelse: 414bc9c2be3SYingwei Zheng ret i32 -1 415bc9c2be3SYingwei Zheng} 416bc9c2be3SYingwei Zheng 417bc9c2be3SYingwei Zhengdefine i32 @simplify_sgt_smax_val(i32 %a, i32 %b) { 418bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_sgt_smax_val 419bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 420bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 421bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], [[B]] 422bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 423bc9c2be3SYingwei Zheng; CHECK: then: 424bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 425bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[ADD]] 426bc9c2be3SYingwei Zheng; CHECK: else: 427bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 428bc9c2be3SYingwei Zheng; 429bc9c2be3SYingwei Zhengstart: 430bc9c2be3SYingwei Zheng %cmp = icmp sgt i32 %a, %b 431bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 432bc9c2be3SYingwei Zhengthen: 433bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 434bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %b, i32 %add) 435bc9c2be3SYingwei Zheng ret i32 %max 436bc9c2be3SYingwei Zhengelse: 437bc9c2be3SYingwei Zheng ret i32 -1 438bc9c2be3SYingwei Zheng} 439bc9c2be3SYingwei Zheng 440bc9c2be3SYingwei Zhengdefine i32 @simplify_sle_smax_val(i32 %a, i32 %b) { 441bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_sle_smax_val 442bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 443bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 444bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A]], [[B]] 445bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 446bc9c2be3SYingwei Zheng; CHECK: then: 447bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 448bc9c2be3SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]]) 449bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[MAX]] 450bc9c2be3SYingwei Zheng; CHECK: else: 451bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 452bc9c2be3SYingwei Zheng; 453bc9c2be3SYingwei Zhengstart: 454bc9c2be3SYingwei Zheng %cmp = icmp sle i32 %a, %b 455bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 456bc9c2be3SYingwei Zhengthen: 457bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 458bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %b, i32 %add) 459bc9c2be3SYingwei Zheng ret i32 %max 460bc9c2be3SYingwei Zhengelse: 461bc9c2be3SYingwei Zheng ret i32 -1 462bc9c2be3SYingwei Zheng} 463bc9c2be3SYingwei Zheng 464bc9c2be3SYingwei Zhengdefine i32 @simplify_sge_smax_val(i32 %a, i32 %b) { 465bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_sge_smax_val 466bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 467bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 468bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A]], [[B]] 469bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 470bc9c2be3SYingwei Zheng; CHECK: then: 471bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 472bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[ADD]] 473bc9c2be3SYingwei Zheng; CHECK: else: 474bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 475bc9c2be3SYingwei Zheng; 476bc9c2be3SYingwei Zhengstart: 477bc9c2be3SYingwei Zheng %cmp = icmp sge i32 %a, %b 478bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 479bc9c2be3SYingwei Zhengthen: 480bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 481bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %b, i32 %add) 482bc9c2be3SYingwei Zheng ret i32 %max 483bc9c2be3SYingwei Zhengelse: 484bc9c2be3SYingwei Zheng ret i32 -1 485bc9c2be3SYingwei Zheng} 486bc9c2be3SYingwei Zheng 487bc9c2be3SYingwei Zhengdefine i32 @simplify_ult_umax_val(i32 %a, i32 %b) { 488bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_ult_umax_val 489bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 490bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 491bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]] 492bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 493bc9c2be3SYingwei Zheng; CHECK: then: 494bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1 495bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[B]] 496bc9c2be3SYingwei Zheng; CHECK: else: 497bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 498bc9c2be3SYingwei Zheng; 499bc9c2be3SYingwei Zhengstart: 500bc9c2be3SYingwei Zheng %cmp = icmp ult i32 %a, %b 501bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 502bc9c2be3SYingwei Zhengthen: 503bc9c2be3SYingwei Zheng %add = add nuw i32 %a, 1 504bc9c2be3SYingwei Zheng %max = call i32 @llvm.umax.i32(i32 %b, i32 %add) 505bc9c2be3SYingwei Zheng ret i32 %max 506bc9c2be3SYingwei Zhengelse: 507bc9c2be3SYingwei Zheng ret i32 -1 508bc9c2be3SYingwei Zheng} 509bc9c2be3SYingwei Zheng 510bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smin_val(i32 %a, i32 %b) { 511bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smin_val 512bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 513bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 514bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 515bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 516bc9c2be3SYingwei Zheng; CHECK: then: 517bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 518bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[ADD]] 519bc9c2be3SYingwei Zheng; CHECK: else: 520bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 521bc9c2be3SYingwei Zheng; 522bc9c2be3SYingwei Zhengstart: 523bc9c2be3SYingwei Zheng %cmp = icmp slt i32 %a, %b 524bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 525bc9c2be3SYingwei Zhengthen: 526bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 527bc9c2be3SYingwei Zheng %max = call i32 @llvm.smin.i32(i32 %b, i32 %add) 528bc9c2be3SYingwei Zheng ret i32 %max 529bc9c2be3SYingwei Zhengelse: 530bc9c2be3SYingwei Zheng ret i32 -1 531bc9c2be3SYingwei Zheng} 532bc9c2be3SYingwei Zheng 533bc9c2be3SYingwei Zhengdefine i32 @simplify_ult_umin_val(i32 %a, i32 %b) { 534bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_ult_umin_val 535bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 536bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 537bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]] 538bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 539bc9c2be3SYingwei Zheng; CHECK: then: 540bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1 541bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[ADD]] 542bc9c2be3SYingwei Zheng; CHECK: else: 543bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 544bc9c2be3SYingwei Zheng; 545bc9c2be3SYingwei Zhengstart: 546bc9c2be3SYingwei Zheng %cmp = icmp ult i32 %a, %b 547bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 548bc9c2be3SYingwei Zhengthen: 549bc9c2be3SYingwei Zheng %add = add nuw i32 %a, 1 550bc9c2be3SYingwei Zheng %max = call i32 @llvm.umin.i32(i32 %b, i32 %add) 551bc9c2be3SYingwei Zheng ret i32 %max 552bc9c2be3SYingwei Zhengelse: 553bc9c2be3SYingwei Zheng ret i32 -1 554bc9c2be3SYingwei Zheng} 555bc9c2be3SYingwei Zheng 556bc9c2be3SYingwei Zhengdefine i32 @simplify_slt_smax_val_fail1(i32 %a, i32 %b) { 557bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_slt_smax_val_fail1 558bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 559bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 560bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 561bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 562bc9c2be3SYingwei Zheng; CHECK: then: 563bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 2 564bc9c2be3SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]]) 565bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[MAX]] 566bc9c2be3SYingwei Zheng; CHECK: else: 567bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 568bc9c2be3SYingwei Zheng; 569bc9c2be3SYingwei Zhengstart: 570bc9c2be3SYingwei Zheng %cmp = icmp slt i32 %a, %b 571bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 572bc9c2be3SYingwei Zhengthen: 573bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 2 574bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %b, i32 %add) 575bc9c2be3SYingwei Zheng ret i32 %max 576bc9c2be3SYingwei Zhengelse: 577bc9c2be3SYingwei Zheng ret i32 -1 578bc9c2be3SYingwei Zheng} 579bc9c2be3SYingwei Zheng 580bc9c2be3SYingwei Zhengdefine i32 @simplify_ult_smax_val_fail2(i32 %a, i32 %b) { 581bc9c2be3SYingwei Zheng; CHECK-LABEL: define i32 @simplify_ult_smax_val_fail2 582bc9c2be3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 583bc9c2be3SYingwei Zheng; CHECK-NEXT: start: 584bc9c2be3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]] 585bc9c2be3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 586bc9c2be3SYingwei Zheng; CHECK: then: 587bc9c2be3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 588bc9c2be3SYingwei Zheng; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]]) 589bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 [[MAX]] 590bc9c2be3SYingwei Zheng; CHECK: else: 591bc9c2be3SYingwei Zheng; CHECK-NEXT: ret i32 -1 592bc9c2be3SYingwei Zheng; 593bc9c2be3SYingwei Zhengstart: 594bc9c2be3SYingwei Zheng %cmp = icmp ult i32 %a, %b 595bc9c2be3SYingwei Zheng br i1 %cmp, label %then, label %else 596bc9c2be3SYingwei Zhengthen: 597bc9c2be3SYingwei Zheng %add = add nsw i32 %a, 1 598bc9c2be3SYingwei Zheng %max = call i32 @llvm.smax.i32(i32 %b, i32 %add) 599bc9c2be3SYingwei Zheng ret i32 %max 600bc9c2be3SYingwei Zhengelse: 601bc9c2be3SYingwei Zheng ret i32 -1 602bc9c2be3SYingwei Zheng} 603bc9c2be3SYingwei Zheng 6048ca351d3SYingwei Zhengdefine i64 @pr82271(i32 %a, i32 %b){ 6058ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271 6068ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 6078ca351d3SYingwei Zheng; CHECK-NEXT: entry: 6088ca351d3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 6098ca351d3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 6108ca351d3SYingwei Zheng; CHECK: then: 6118ca351d3SYingwei Zheng; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64 6128ca351d3SYingwei Zheng; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64 6138ca351d3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 614*87b1e735SYingwei Zheng; CHECK-NEXT: ret i64 [[SB]] 6158ca351d3SYingwei Zheng; CHECK: else: 6168ca351d3SYingwei Zheng; CHECK-NEXT: ret i64 0 6178ca351d3SYingwei Zheng; 6188ca351d3SYingwei Zhengentry: 6198ca351d3SYingwei Zheng %cmp = icmp slt i32 %a, %b 6208ca351d3SYingwei Zheng br i1 %cmp, label %then, label %else 6218ca351d3SYingwei Zheng 6228ca351d3SYingwei Zhengthen: 6238ca351d3SYingwei Zheng %sa = sext i32 %a to i64 6248ca351d3SYingwei Zheng %sb = sext i32 %b to i64 6258ca351d3SYingwei Zheng %add = add nsw i64 %sa, 1 6268ca351d3SYingwei Zheng %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add) 6278ca351d3SYingwei Zheng ret i64 %smax 6288ca351d3SYingwei Zheng 6298ca351d3SYingwei Zhengelse: 6308ca351d3SYingwei Zheng ret i64 0 6318ca351d3SYingwei Zheng} 6328ca351d3SYingwei Zheng 6338ca351d3SYingwei Zhengdefine i64 @pr82271_sext_zext_nneg(i32 %a, i32 %b){ 6348ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271_sext_zext_nneg 6358ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 6368ca351d3SYingwei Zheng; CHECK-NEXT: entry: 6378ca351d3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 6388ca351d3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 6398ca351d3SYingwei Zheng; CHECK: then: 6408ca351d3SYingwei Zheng; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64 6418ca351d3SYingwei Zheng; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64 6428ca351d3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 643*87b1e735SYingwei Zheng; CHECK-NEXT: ret i64 [[SB]] 6448ca351d3SYingwei Zheng; CHECK: else: 6458ca351d3SYingwei Zheng; CHECK-NEXT: ret i64 0 6468ca351d3SYingwei Zheng; 6478ca351d3SYingwei Zhengentry: 6488ca351d3SYingwei Zheng %cmp = icmp slt i32 %a, %b 6498ca351d3SYingwei Zheng br i1 %cmp, label %then, label %else 6508ca351d3SYingwei Zheng 6518ca351d3SYingwei Zhengthen: 6528ca351d3SYingwei Zheng %sa = sext i32 %a to i64 6538ca351d3SYingwei Zheng %sb = zext nneg i32 %b to i64 6548ca351d3SYingwei Zheng %add = add nsw i64 %sa, 1 6558ca351d3SYingwei Zheng %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add) 6568ca351d3SYingwei Zheng ret i64 %smax 6578ca351d3SYingwei Zheng 6588ca351d3SYingwei Zhengelse: 6598ca351d3SYingwei Zheng ret i64 0 6608ca351d3SYingwei Zheng} 6618ca351d3SYingwei Zheng 6628ca351d3SYingwei Zhengdefine i64 @pr82271_zext_nneg(i32 %a, i32 %b){ 6638ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271_zext_nneg 6648ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 6658ca351d3SYingwei Zheng; CHECK-NEXT: entry: 6668ca351d3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 6678ca351d3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 6688ca351d3SYingwei Zheng; CHECK: then: 6698ca351d3SYingwei Zheng; CHECK-NEXT: [[SA:%.*]] = zext nneg i32 [[A]] to i64 6708ca351d3SYingwei Zheng; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64 6718ca351d3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 672*87b1e735SYingwei Zheng; CHECK-NEXT: ret i64 [[SB]] 6738ca351d3SYingwei Zheng; CHECK: else: 6748ca351d3SYingwei Zheng; CHECK-NEXT: ret i64 0 6758ca351d3SYingwei Zheng; 6768ca351d3SYingwei Zhengentry: 6778ca351d3SYingwei Zheng %cmp = icmp slt i32 %a, %b 6788ca351d3SYingwei Zheng br i1 %cmp, label %then, label %else 6798ca351d3SYingwei Zheng 6808ca351d3SYingwei Zhengthen: 6818ca351d3SYingwei Zheng %sa = zext nneg i32 %a to i64 6828ca351d3SYingwei Zheng %sb = zext nneg i32 %b to i64 6838ca351d3SYingwei Zheng %add = add nsw i64 %sa, 1 6848ca351d3SYingwei Zheng %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add) 6858ca351d3SYingwei Zheng ret i64 %smax 6868ca351d3SYingwei Zheng 6878ca351d3SYingwei Zhengelse: 6888ca351d3SYingwei Zheng ret i64 0 6898ca351d3SYingwei Zheng} 6908ca351d3SYingwei Zheng 6918ca351d3SYingwei Zhengdefine i64 @pr82271_zext(i32 %a, i32 %b){ 6928ca351d3SYingwei Zheng; CHECK-LABEL: define i64 @pr82271_zext 6938ca351d3SYingwei Zheng; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { 6948ca351d3SYingwei Zheng; CHECK-NEXT: entry: 6958ca351d3SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 6968ca351d3SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 6978ca351d3SYingwei Zheng; CHECK: then: 6988ca351d3SYingwei Zheng; CHECK-NEXT: [[SA:%.*]] = zext i32 [[A]] to i64 6998ca351d3SYingwei Zheng; CHECK-NEXT: [[SB:%.*]] = zext i32 [[B]] to i64 7008ca351d3SYingwei Zheng; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 7018ca351d3SYingwei Zheng; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]]) 7028ca351d3SYingwei Zheng; CHECK-NEXT: ret i64 [[SMAX]] 7038ca351d3SYingwei Zheng; CHECK: else: 7048ca351d3SYingwei Zheng; CHECK-NEXT: ret i64 0 7058ca351d3SYingwei Zheng; 7068ca351d3SYingwei Zhengentry: 7078ca351d3SYingwei Zheng %cmp = icmp slt i32 %a, %b 7088ca351d3SYingwei Zheng br i1 %cmp, label %then, label %else 7098ca351d3SYingwei Zheng 7108ca351d3SYingwei Zhengthen: 7118ca351d3SYingwei Zheng %sa = zext i32 %a to i64 7128ca351d3SYingwei Zheng %sb = zext i32 %b to i64 7138ca351d3SYingwei Zheng %add = add nsw i64 %sa, 1 7148ca351d3SYingwei Zheng %smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add) 7158ca351d3SYingwei Zheng ret i64 %smax 7168ca351d3SYingwei Zheng 7178ca351d3SYingwei Zhengelse: 7188ca351d3SYingwei Zheng ret i64 0 7198ca351d3SYingwei Zheng} 7208ca351d3SYingwei Zheng 721de0d27c1SYingwei Zhengdeclare i32 @llvm.smin.i32(i32, i32) 722de0d27c1SYingwei Zhengdeclare i32 @llvm.smax.i32(i32, i32) 723de0d27c1SYingwei Zhengdeclare i32 @llvm.umin.i32(i32, i32) 724de0d27c1SYingwei Zhengdeclare i32 @llvm.umax.i32(i32, i32) 725