237 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; Should fold5; (%x + %y) u>= %x6; or7; (%x + %y) u>= %y8; to9; @llvm.uadd.with.overflow(%x, %y) + extractvalue + not10;11; All tests here have extra uses, to ensure that the pattern isn't perturbed.12 13declare void @use8(i8)14declare void @use2x8(<2 x i8>)15 16define i1 @t0_basic(i8 %x, i8 %y) {17; CHECK-LABEL: @t0_basic(18; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]19; CHECK-NEXT: call void @use8(i8 [[T0]])20; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[T0]], [[Y]]21; CHECK-NEXT: ret i1 [[R]]22;23 %t0 = add i8 %x, %y24 call void @use8(i8 %t0)25 %r = icmp uge i8 %t0, %y26 ret i1 %r27}28 29define <2 x i1> @t1_vec(<2 x i8> %x, <2 x i8> %y) {30; CHECK-LABEL: @t1_vec(31; CHECK-NEXT: [[T0:%.*]] = add <2 x i8> [[X:%.*]], [[Y:%.*]]32; CHECK-NEXT: call void @use2x8(<2 x i8> [[T0]])33; CHECK-NEXT: [[R:%.*]] = icmp uge <2 x i8> [[T0]], [[Y]]34; CHECK-NEXT: ret <2 x i1> [[R]]35;36 %t0 = add <2 x i8> %x, %y37 call void @use2x8(<2 x i8> %t0)38 %r = icmp uge <2 x i8> %t0, %y39 ret <2 x i1> %r40}41 42; Commutativity43 44define i1 @t2_symmetry(i8 %x, i8 %y) {45; CHECK-LABEL: @t2_symmetry(46; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]47; CHECK-NEXT: call void @use8(i8 [[T0]])48; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[T0]], [[X]]49; CHECK-NEXT: ret i1 [[R]]50;51 %t0 = add i8 %x, %y52 call void @use8(i8 %t0)53 %r = icmp uge i8 %t0, %x ; can check against either of `add` arguments54 ret i1 %r55}56 57declare i8 @gen8()58 59define i1 @t3_commutative(i8 %x) {60; CHECK-LABEL: @t3_commutative(61; CHECK-NEXT: [[Y:%.*]] = call i8 @gen8()62; CHECK-NEXT: [[T0:%.*]] = add i8 [[Y]], [[X:%.*]]63; CHECK-NEXT: call void @use8(i8 [[T0]])64; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[T0]], [[Y]]65; CHECK-NEXT: ret i1 [[R]]66;67 %y = call i8 @gen8()68 %t0 = add i8 %y, %x ; swapped69 call void @use8(i8 %t0)70 %r = icmp uge i8 %t0, %y71 ret i1 %r72}73 74define i1 @t4_commutative() {75; CHECK-LABEL: @t4_commutative(76; CHECK-NEXT: [[X:%.*]] = call i8 @gen8()77; CHECK-NEXT: [[Y:%.*]] = call i8 @gen8()78; CHECK-NEXT: [[T0:%.*]] = add i8 [[X]], [[Y]]79; CHECK-NEXT: call void @use8(i8 [[T0]])80; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[Y]], [[T0]]81; CHECK-NEXT: ret i1 [[R]]82;83 %x = call i8 @gen8()84 %y = call i8 @gen8()85 %t0 = add i8 %x, %y86 call void @use8(i8 %t0)87 %r = icmp ule i8 %y, %t0 ; swapped88 ret i1 %r89}90 91define i1 @t5_commutative(i8 %x) {92; CHECK-LABEL: @t5_commutative(93; CHECK-NEXT: [[Y:%.*]] = call i8 @gen8()94; CHECK-NEXT: [[T0:%.*]] = add i8 [[Y]], [[X:%.*]]95; CHECK-NEXT: call void @use8(i8 [[T0]])96; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[Y]], [[T0]]97; CHECK-NEXT: ret i1 [[R]]98;99 %y = call i8 @gen8()100 %t0 = add i8 %y, %x ; swapped101 call void @use8(i8 %t0)102 %r = icmp ule i8 %y, %t0 ; swapped103 ret i1 %r104}105 106; Extra-use tests107 108define i1 @t6_no_extrause(i8 %x, i8 %y) {109; CHECK-LABEL: @t6_no_extrause(110; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -1111; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[X:%.*]], [[TMP1]]112; CHECK-NEXT: ret i1 [[R]]113;114 %t0 = add i8 %x, %y115 %r = icmp uge i8 %t0, %y116 ret i1 %r117}118 119; Negative tests120 121define i1 @n7_different_y(i8 %x, i8 %y0, i8 %y1) {122; CHECK-LABEL: @n7_different_y(123; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y0:%.*]]124; CHECK-NEXT: call void @use8(i8 [[T0]])125; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[T0]], [[Y1:%.*]]126; CHECK-NEXT: ret i1 [[R]]127;128 %t0 = add i8 %x, %y0129 call void @use8(i8 %t0)130 %r = icmp uge i8 %t0, %y1131 ret i1 %r132}133 134define i1 @n8_wrong_pred0(i8 %x, i8 %y) {135; CHECK-LABEL: @n8_wrong_pred0(136; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]137; CHECK-NEXT: call void @use8(i8 [[T0]])138; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[T0]], [[Y]]139; CHECK-NEXT: ret i1 [[R]]140;141 %t0 = add i8 %x, %y142 call void @use8(i8 %t0)143 %r = icmp ule i8 %t0, %y144 ret i1 %r145}146 147define i1 @n9_wrong_pred1(i8 %x, i8 %y) {148; CHECK-LABEL: @n9_wrong_pred1(149; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]150; CHECK-NEXT: call void @use8(i8 [[T0]])151; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[T0]], [[Y]]152; CHECK-NEXT: ret i1 [[R]]153;154 %t0 = add i8 %x, %y155 call void @use8(i8 %t0)156 %r = icmp ugt i8 %t0, %y157 ret i1 %r158}159 160define i1 @n10_wrong_pred2(i8 %x, i8 %y) {161; CHECK-LABEL: @n10_wrong_pred2(162; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]163; CHECK-NEXT: call void @use8(i8 [[T0]])164; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X]], 0165; CHECK-NEXT: ret i1 [[R]]166;167 %t0 = add i8 %x, %y168 call void @use8(i8 %t0)169 %r = icmp eq i8 %t0, %y170 ret i1 %r171}172 173define i1 @n11_wrong_pred3(i8 %x, i8 %y) {174; CHECK-LABEL: @n11_wrong_pred3(175; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]176; CHECK-NEXT: call void @use8(i8 [[T0]])177; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[X]], 0178; CHECK-NEXT: ret i1 [[R]]179;180 %t0 = add i8 %x, %y181 call void @use8(i8 %t0)182 %r = icmp ne i8 %t0, %y183 ret i1 %r184}185 186define i1 @n12_wrong_pred4(i8 %x, i8 %y) {187; CHECK-LABEL: @n12_wrong_pred4(188; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]189; CHECK-NEXT: call void @use8(i8 [[T0]])190; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[T0]], [[Y]]191; CHECK-NEXT: ret i1 [[R]]192;193 %t0 = add i8 %x, %y194 call void @use8(i8 %t0)195 %r = icmp slt i8 %t0, %y196 ret i1 %r197}198 199define i1 @n13_wrong_pred5(i8 %x, i8 %y) {200; CHECK-LABEL: @n13_wrong_pred5(201; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]202; CHECK-NEXT: call void @use8(i8 [[T0]])203; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[T0]], [[Y]]204; CHECK-NEXT: ret i1 [[R]]205;206 %t0 = add i8 %x, %y207 call void @use8(i8 %t0)208 %r = icmp sle i8 %t0, %y209 ret i1 %r210}211 212define i1 @n14_wrong_pred6(i8 %x, i8 %y) {213; CHECK-LABEL: @n14_wrong_pred6(214; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]215; CHECK-NEXT: call void @use8(i8 [[T0]])216; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[T0]], [[Y]]217; CHECK-NEXT: ret i1 [[R]]218;219 %t0 = add i8 %x, %y220 call void @use8(i8 %t0)221 %r = icmp sgt i8 %t0, %y222 ret i1 %r223}224 225define i1 @n15_wrong_pred7(i8 %x, i8 %y) {226; CHECK-LABEL: @n15_wrong_pred7(227; CHECK-NEXT: [[T0:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]228; CHECK-NEXT: call void @use8(i8 [[T0]])229; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[T0]], [[Y]]230; CHECK-NEXT: ret i1 [[R]]231;232 %t0 = add i8 %x, %y233 call void @use8(i8 %t0)234 %r = icmp sge i8 %t0, %y235 ret i1 %r236}237