1530bbc8fSNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2530bbc8fSNoah Goldstein; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3530bbc8fSNoah Goldstein 4530bbc8fSNoah Goldsteindeclare void @llvm.assume(i1) 5*ab3fdbdfSAllendeclare void @use(i64) 6*ab3fdbdfSAllendeclare void @use4(i4) 72622b2f4SNoah Goldstein 8530bbc8fSNoah Goldsteindefine i1 @select_v_ne_fail(i8 %v, i8 %C, i8 %y) { 9530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_ne_fail( 10530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 11530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 12530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[V:%.*]], [[C:%.*]] 13530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 14530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 15530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 16530bbc8fSNoah Goldstein; 17530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 18530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 19530bbc8fSNoah Goldstein %cmp = icmp ne i8 %v, %C 20530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 21530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 22530bbc8fSNoah Goldstein ret i1 %r 23530bbc8fSNoah Goldstein} 24530bbc8fSNoah Goldstein 25530bbc8fSNoah Goldsteindefine i1 @select_v_eq_nz(i8 %v, i8 %C, i8 %y) { 26530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_eq_nz( 27530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 28530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 29530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0 30530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 31530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], [[V:%.*]] 32530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 33530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 34530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 35530bbc8fSNoah Goldstein; 36530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 37530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 38530bbc8fSNoah Goldstein %pcond0 = icmp ne i8 %C, 0 39530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 40530bbc8fSNoah Goldstein %cmp = icmp eq i8 %C, %v 41530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 42530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 43530bbc8fSNoah Goldstein ret i1 %r 44530bbc8fSNoah Goldstein} 45530bbc8fSNoah Goldstein 46530bbc8fSNoah Goldsteindefine i1 @inv_select_v_ugt_nz(i8 %v, i8 %C, i8 %y) { 47530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_ugt_nz( 48530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 49530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 50530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0 51530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 52530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]] 53530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]] 54530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 55530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 56530bbc8fSNoah Goldstein; 57530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 58530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 59530bbc8fSNoah Goldstein %pcond0 = icmp ne i8 %C, 0 60530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 61530bbc8fSNoah Goldstein %cmp = icmp ugt i8 %C, %v 62530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %y, i8 %v 63530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 64530bbc8fSNoah Goldstein ret i1 %r 65530bbc8fSNoah Goldstein} 66530bbc8fSNoah Goldstein 67530bbc8fSNoah Goldsteindefine i1 @inv_select_v_ugt_fail(i8 %v, i8 %C, i8 %y) { 68530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_ugt_fail( 69530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 70530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 71530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -8 72530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 73530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]] 74530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]] 75530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 76530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 77530bbc8fSNoah Goldstein; 78530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 79530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 80530bbc8fSNoah Goldstein %pcond0 = icmp sge i8 %C, -8 81530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 82530bbc8fSNoah Goldstein %cmp = icmp ugt i8 %C, %v 83530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %y, i8 %v 84530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 85530bbc8fSNoah Goldstein ret i1 %r 86530bbc8fSNoah Goldstein} 87530bbc8fSNoah Goldstein 88530bbc8fSNoah Goldsteindefine i1 @select_v_uge_nz(i8 %v, i8 %C, i8 %y) { 89530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_uge_nz( 90530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 91530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 92530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 0 93530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 94530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[V:%.*]], [[C]] 95530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 96530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 97530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 98530bbc8fSNoah Goldstein; 99530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 100530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 101530bbc8fSNoah Goldstein %pcond0 = icmp ne i8 %C, 0 102530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 103530bbc8fSNoah Goldstein %cmp = icmp uge i8 %v, %C 104530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 105530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 106530bbc8fSNoah Goldstein ret i1 %r 107530bbc8fSNoah Goldstein} 108530bbc8fSNoah Goldstein 109530bbc8fSNoah Goldsteindefine i1 @select_v_sgt_nonneg(i8 %v, i8 %C, i8 %y) { 110530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sgt_nonneg( 111530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 112530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 113530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0 114530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 115530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]] 116530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 117530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 118530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 119530bbc8fSNoah Goldstein; 120530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 121530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 122530bbc8fSNoah Goldstein %pcond0 = icmp sge i8 %C, 0 123530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 124530bbc8fSNoah Goldstein %cmp = icmp sgt i8 %v, %C 125530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 126530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 127530bbc8fSNoah Goldstein ret i1 %r 128530bbc8fSNoah Goldstein} 129530bbc8fSNoah Goldstein 130530bbc8fSNoah Goldsteindefine i1 @select_v_sgt_fail(i8 %v, i8 %C, i8 %y) { 131530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sgt_fail( 132530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 133530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 134530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -4 135530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 136530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]] 137530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 138530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 139530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 140530bbc8fSNoah Goldstein; 141530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 142530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 143530bbc8fSNoah Goldstein %pcond0 = icmp sge i8 %C, -4 144530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 145530bbc8fSNoah Goldstein %cmp = icmp sgt i8 %v, %C 146530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 147530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 148530bbc8fSNoah Goldstein ret i1 %r 149530bbc8fSNoah Goldstein} 150530bbc8fSNoah Goldstein 151530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sgt_neg(i8 %v, i8 %C, i8 %y) { 152530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sgt_neg( 153530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 154530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 155530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0 156530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 157530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]] 158530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]] 159530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 160530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 161530bbc8fSNoah Goldstein; 162530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 163530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 164530bbc8fSNoah Goldstein %pcond0 = icmp slt i8 %C, 0 165530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 166530bbc8fSNoah Goldstein %cmp = icmp sgt i8 %v, %C 167530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %y, i8 %v 168530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 169530bbc8fSNoah Goldstein ret i1 %r 170530bbc8fSNoah Goldstein} 171530bbc8fSNoah Goldstein 172530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sgt_nonneg_nz(i8 %v, i8 %C, i8 %y) { 173530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sgt_nonneg_nz( 174530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 175530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 176530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0 177530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 178530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[C]], [[V:%.*]] 179530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]] 180530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 181530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 182530bbc8fSNoah Goldstein; 183530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 184530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 185530bbc8fSNoah Goldstein %pcond0 = icmp sgt i8 %C, 0 186530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 187530bbc8fSNoah Goldstein %cmp = icmp sgt i8 %C, %v 188530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %y, i8 %v 189530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 190530bbc8fSNoah Goldstein ret i1 %r 191530bbc8fSNoah Goldstein} 192530bbc8fSNoah Goldstein 193530bbc8fSNoah Goldsteindefine i1 @select_v_slt_nonneg(i8 %v, i8 %C, i8 %y) { 194530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_slt_nonneg( 195530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 196530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 197530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0 198530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 199530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]] 200530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 201530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 202530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 203530bbc8fSNoah Goldstein; 204530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 205530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 206530bbc8fSNoah Goldstein %pcond0 = icmp sge i8 %C, 0 207530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 208530bbc8fSNoah Goldstein %cmp = icmp slt i8 %C, %v 209530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 210530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 211530bbc8fSNoah Goldstein ret i1 %r 212530bbc8fSNoah Goldstein} 213530bbc8fSNoah Goldstein 214530bbc8fSNoah Goldsteindefine i1 @select_v_slt_nonneg_fail(i8 %v, i8 %C, i8 %y) { 215530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_slt_nonneg_fail( 216530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 217530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 218530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -1 219530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 220530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]] 221530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 222530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 223530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 224530bbc8fSNoah Goldstein; 225530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 226530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 227530bbc8fSNoah Goldstein %pcond0 = icmp sge i8 %C, -1 228530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 229530bbc8fSNoah Goldstein %cmp = icmp slt i8 %C, %v 230530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 231530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 232530bbc8fSNoah Goldstein ret i1 %r 233530bbc8fSNoah Goldstein} 234530bbc8fSNoah Goldstein 235530bbc8fSNoah Goldsteindefine i1 @select_v_slt_neg(i8 %v, i8 %C, i8 %y) { 236530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_slt_neg( 237530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 238530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 239530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0 240530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 241530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[V:%.*]], [[C]] 242530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 243530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 244530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 245530bbc8fSNoah Goldstein; 246530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 247530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 248530bbc8fSNoah Goldstein %pcond0 = icmp slt i8 %C, 0 249530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 250530bbc8fSNoah Goldstein %cmp = icmp slt i8 %v, %C 251530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 252530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 253530bbc8fSNoah Goldstein ret i1 %r 254530bbc8fSNoah Goldstein} 255530bbc8fSNoah Goldstein 256530bbc8fSNoah Goldsteindefine i1 @select_v_sge_nonneg_nz(i8 %v, i8 %C, i8 %y) { 257530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sge_nonneg_nz( 258530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 259530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 260530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0 261530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 262530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C]] 263530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 264530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 265530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 266530bbc8fSNoah Goldstein; 267530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 268530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 269530bbc8fSNoah Goldstein %pcond0 = icmp sgt i8 %C, 0 270530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 271530bbc8fSNoah Goldstein %cmp = icmp sge i8 %v, %C 272530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 273530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 274530bbc8fSNoah Goldstein ret i1 %r 275530bbc8fSNoah Goldstein} 276530bbc8fSNoah Goldstein 277530bbc8fSNoah Goldsteindefine i1 @select_v_sge_neg(i8 %v, i8 %C, i8 %y) { 278530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sge_neg( 279530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 280530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 281530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0 282530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 283530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[C]], [[V:%.*]] 284530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 285530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 286530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 287530bbc8fSNoah Goldstein; 288530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 289530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 290530bbc8fSNoah Goldstein %pcond0 = icmp slt i8 %C, 0 291530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 292530bbc8fSNoah Goldstein %cmp = icmp sge i8 %C, %v 293530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 294530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 295530bbc8fSNoah Goldstein ret i1 %r 296530bbc8fSNoah Goldstein} 297530bbc8fSNoah Goldstein 298530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sge_fail(i8 %v, i8 %C, i8 %y) { 299530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sge_fail( 300530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 301530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 302530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C:%.*]] 303530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]] 304530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 305530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 306530bbc8fSNoah Goldstein; 307530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 308530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 309530bbc8fSNoah Goldstein %cmp = icmp sge i8 %v, %C 310530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %y, i8 %v 311530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 312530bbc8fSNoah Goldstein ret i1 %r 313530bbc8fSNoah Goldstein} 314530bbc8fSNoah Goldstein 315530bbc8fSNoah Goldsteindefine i1 @select_v_sle_neg(i8 %v, i8 %C, i8 %y) { 316530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sle_neg( 317530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 318530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 319530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0 320530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 321530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]] 322530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 323530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 324530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 325530bbc8fSNoah Goldstein; 326530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 327530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 328530bbc8fSNoah Goldstein %pcond0 = icmp slt i8 %C, 0 329530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 330530bbc8fSNoah Goldstein %cmp = icmp sle i8 %v, %C 331530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 332530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 333530bbc8fSNoah Goldstein ret i1 %r 334530bbc8fSNoah Goldstein} 335530bbc8fSNoah Goldstein 336530bbc8fSNoah Goldsteindefine i1 @select_v_sle_nonneg_nz(i8 %v, i8 %C, i8 %y) { 337530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sle_nonneg_nz( 338530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 339530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 340530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0 341530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 342530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]] 343530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 344530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 345530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 346530bbc8fSNoah Goldstein; 347530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 348530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 349530bbc8fSNoah Goldstein %pcond0 = icmp sgt i8 %C, 0 350530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 351530bbc8fSNoah Goldstein %cmp = icmp sle i8 %C, %v 352530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 353530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 354530bbc8fSNoah Goldstein ret i1 %r 355530bbc8fSNoah Goldstein} 356530bbc8fSNoah Goldstein 357530bbc8fSNoah Goldsteindefine i1 @select_v_sle_fail(i8 %v, i8 %C, i8 %y) { 358530bbc8fSNoah Goldstein; CHECK-LABEL: @select_v_sle_fail( 359530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 360530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 361530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0 362530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 363530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]] 364530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 365530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 366530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 367530bbc8fSNoah Goldstein; 368530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 369530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 370530bbc8fSNoah Goldstein %pcond0 = icmp sge i8 %C, 0 371530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 372530bbc8fSNoah Goldstein %cmp = icmp sle i8 %C, %v 373530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %v, i8 %y 374530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 375530bbc8fSNoah Goldstein ret i1 %r 376530bbc8fSNoah Goldstein} 377530bbc8fSNoah Goldstein 378530bbc8fSNoah Goldsteindefine i1 @inv_select_v_sle_nonneg(i8 %v, i8 %C, i8 %y) { 379530bbc8fSNoah Goldstein; CHECK-LABEL: @inv_select_v_sle_nonneg( 380530bbc8fSNoah Goldstein; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 381530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 382530bbc8fSNoah Goldstein; CHECK-NEXT: [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0 383530bbc8fSNoah Goldstein; CHECK-NEXT: call void @llvm.assume(i1 [[PCOND0]]) 384530bbc8fSNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]] 385530bbc8fSNoah Goldstein; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]] 386530bbc8fSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 387530bbc8fSNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 388530bbc8fSNoah Goldstein; 389530bbc8fSNoah Goldstein %ynz = icmp ne i8 %y, 0 390530bbc8fSNoah Goldstein call void @llvm.assume(i1 %ynz) 391530bbc8fSNoah Goldstein %pcond0 = icmp sge i8 %C, 0 392530bbc8fSNoah Goldstein call void @llvm.assume(i1 %pcond0) 393530bbc8fSNoah Goldstein %cmp = icmp sle i8 %v, %C 394530bbc8fSNoah Goldstein %s = select i1 %cmp, i8 %y, i8 %v 395530bbc8fSNoah Goldstein %r = icmp eq i8 %s, 0 396530bbc8fSNoah Goldstein ret i1 %r 397530bbc8fSNoah Goldstein} 398076581fdSDhruv Chawla 399076581fdSDhruv Chawla; Check udiv/sdiv occuring before icmp. 400076581fdSDhruv Chawladefine i64 @incorrect_safe_div_1(i64 %n, i64 %d) { 401076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_1( 402076581fdSDhruv Chawla; CHECK-NEXT: [[TMP1:%.*]] = udiv i64 [[N:%.*]], [[D:%.*]] 403076581fdSDhruv Chawla; CHECK-NEXT: ret i64 [[TMP1]] 404076581fdSDhruv Chawla; 405076581fdSDhruv Chawla %1 = udiv i64 %n, %d 406076581fdSDhruv Chawla %2 = icmp eq i64 %d, 0 407076581fdSDhruv Chawla %3 = select i1 %2, i64 -1, i64 %1 408076581fdSDhruv Chawla ret i64 %3 409076581fdSDhruv Chawla} 410076581fdSDhruv Chawla 411076581fdSDhruv Chawla; Check icmp occuring before udiv/sdiv. 412076581fdSDhruv Chawladefine i64 @incorrect_safe_div_2(i64 %n, i64 %d) { 413076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_2( 414076581fdSDhruv Chawla; CHECK-NEXT: [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]] 415076581fdSDhruv Chawla; CHECK-NEXT: ret i64 [[TMP1]] 416076581fdSDhruv Chawla; 417076581fdSDhruv Chawla %1 = icmp eq i64 %d, 0 418076581fdSDhruv Chawla %2 = sdiv i64 %n, %d 419076581fdSDhruv Chawla %3 = select i1 %1, i64 -1, i64 %2 420076581fdSDhruv Chawla ret i64 %3 421076581fdSDhruv Chawla} 422076581fdSDhruv Chawla 423076581fdSDhruv Chawladefine i64 @incorrect_safe_div_call_1(i64 %n, i64 %d) { 424076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_call_1( 425076581fdSDhruv Chawla; CHECK-NEXT: [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]] 426076581fdSDhruv Chawla; CHECK-NEXT: tail call void @use(i64 [[D]]) 427076581fdSDhruv Chawla; CHECK-NEXT: ret i64 [[TMP1]] 428076581fdSDhruv Chawla; 429076581fdSDhruv Chawla %1 = sdiv i64 %n, %d 430076581fdSDhruv Chawla tail call void @use(i64 %d) 431076581fdSDhruv Chawla %2 = icmp eq i64 %d, 0 432076581fdSDhruv Chawla %3 = select i1 %2, i64 -1, i64 %1 433076581fdSDhruv Chawla ret i64 %3 434076581fdSDhruv Chawla} 435076581fdSDhruv Chawla 436076581fdSDhruv Chawladefine i64 @incorrect_safe_div_call_2(i64 %n, i64 %d) { 437076581fdSDhruv Chawla; CHECK-LABEL: @incorrect_safe_div_call_2( 438076581fdSDhruv Chawla; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[D:%.*]], 0 439076581fdSDhruv Chawla; CHECK-NEXT: tail call void @use(i64 [[D]]) 440076581fdSDhruv Chawla; CHECK-NEXT: [[TMP2:%.*]] = udiv i64 [[N:%.*]], [[D]] 441076581fdSDhruv Chawla; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP1]], i64 -1, i64 [[TMP2]] 442076581fdSDhruv Chawla; CHECK-NEXT: ret i64 [[TMP3]] 443076581fdSDhruv Chawla; 444076581fdSDhruv Chawla %1 = icmp eq i64 %d, 0 445076581fdSDhruv Chawla tail call void @use(i64 %d) 446076581fdSDhruv Chawla %2 = udiv i64 %n, %d 447076581fdSDhruv Chawla %3 = select i1 %1, i64 -1, i64 %2 448076581fdSDhruv Chawla ret i64 %3 449076581fdSDhruv Chawla} 450076581fdSDhruv Chawla 451*ab3fdbdfSAllen; https://alive2.llvm.org/ce/z/Si_B7b 452*ab3fdbdfSAllendefine i4 @icmp_urem(i4 %n, i4 %d) { 453*ab3fdbdfSAllen; CHECK-LABEL: @icmp_urem( 454*ab3fdbdfSAllen; CHECK-NEXT: [[TMP1:%.*]] = urem i4 [[N:%.*]], [[D:%.*]] 455*ab3fdbdfSAllen; CHECK-NEXT: ret i4 [[TMP1]] 456*ab3fdbdfSAllen; 457*ab3fdbdfSAllen %1 = icmp eq i4 %d, 0 458*ab3fdbdfSAllen %2 = urem i4 %n, %d 459*ab3fdbdfSAllen %3 = select i1 %1, i4 -1, i4 %2 460*ab3fdbdfSAllen ret i4 %3 461*ab3fdbdfSAllen} 462*ab3fdbdfSAllen 463*ab3fdbdfSAllendefine i4 @icmp_urem_clobber_by_call(i4 %n, i4 %d) { 464*ab3fdbdfSAllen; CHECK-LABEL: @icmp_urem_clobber_by_call( 465*ab3fdbdfSAllen; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0 466*ab3fdbdfSAllen; CHECK-NEXT: tail call void @use4(i4 [[D]]) 467*ab3fdbdfSAllen; CHECK-NEXT: [[TMP2:%.*]] = urem i4 [[N:%.*]], [[D]] 468*ab3fdbdfSAllen; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]] 469*ab3fdbdfSAllen; CHECK-NEXT: ret i4 [[TMP3]] 470*ab3fdbdfSAllen; 471*ab3fdbdfSAllen %1 = icmp eq i4 %d, 0 472*ab3fdbdfSAllen tail call void @use4(i4 %d) 473*ab3fdbdfSAllen %2 = urem i4 %n, %d 474*ab3fdbdfSAllen %3 = select i1 %1, i4 -1, i4 %2 475*ab3fdbdfSAllen ret i4 %3 476*ab3fdbdfSAllen} 477*ab3fdbdfSAllen 478*ab3fdbdfSAllen; https://alive2.llvm.org/ce/z/Fn3Wac 479*ab3fdbdfSAllendefine i4 @icmp_srem(i4 %n, i4 %d) { 480*ab3fdbdfSAllen; CHECK-LABEL: @icmp_srem( 481*ab3fdbdfSAllen; CHECK-NEXT: [[TMP1:%.*]] = srem i4 [[N:%.*]], [[D:%.*]] 482*ab3fdbdfSAllen; CHECK-NEXT: ret i4 [[TMP1]] 483*ab3fdbdfSAllen; 484*ab3fdbdfSAllen %1 = icmp eq i4 %d, 0 485*ab3fdbdfSAllen %2 = srem i4 %n, %d 486*ab3fdbdfSAllen %3 = select i1 %1, i4 -1, i4 %2 487*ab3fdbdfSAllen ret i4 %3 488*ab3fdbdfSAllen} 489*ab3fdbdfSAllen 490*ab3fdbdfSAllendefine i4 @icmp_srem_clobber_by_call(i4 %n, i4 %d) { 491*ab3fdbdfSAllen; CHECK-LABEL: @icmp_srem_clobber_by_call( 492*ab3fdbdfSAllen; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0 493*ab3fdbdfSAllen; CHECK-NEXT: tail call void @use4(i4 [[D]]) 494*ab3fdbdfSAllen; CHECK-NEXT: [[TMP2:%.*]] = srem i4 [[N:%.*]], [[D]] 495*ab3fdbdfSAllen; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]] 496*ab3fdbdfSAllen; CHECK-NEXT: ret i4 [[TMP3]] 497*ab3fdbdfSAllen; 498*ab3fdbdfSAllen %1 = icmp eq i4 %d, 0 499*ab3fdbdfSAllen tail call void @use4(i4 %d) 500*ab3fdbdfSAllen %2 = srem i4 %n, %d 501*ab3fdbdfSAllen %3 = select i1 %1, i4 -1, i4 %2 502*ab3fdbdfSAllen ret i4 %3 503*ab3fdbdfSAllen} 504