118 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; Fold5; x - ((x / y) * y)6; to7; x % y8 9; Also,10; ((x / y) * y)11; can then be simplified to12; x - (x % y)13 14declare void @use8(i8)15declare void @use2xi8(<2 x i8>)16 17define i8 @t0_basic(i8 %x, i8 %y) {18; CHECK-LABEL: @t0_basic(19; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], [[Y:%.*]]20; CHECK-NEXT: call void @use8(i8 [[DIV]])21; CHECK-NEXT: [[ROUNDXDOWNTOMULTIPLEOFY:%.*]] = mul i8 [[DIV]], [[Y]]22; CHECK-NEXT: [[REM:%.*]] = sub i8 [[X]], [[ROUNDXDOWNTOMULTIPLEOFY]]23; CHECK-NEXT: ret i8 [[REM]]24;25 %div = sdiv i8 %x, %y26 call void @use8(i8 %div)27 %roundXdownToMultipleOfY = mul i8 %div, %y28 %rem = sub i8 %x, %roundXdownToMultipleOfY29 ret i8 %rem30}31 32define <2 x i8> @t1_vector(<2 x i8> %x, <2 x i8> %y) {33; CHECK-LABEL: @t1_vector(34; CHECK-NEXT: [[DIV:%.*]] = sdiv <2 x i8> [[X:%.*]], [[Y:%.*]]35; CHECK-NEXT: call void @use2xi8(<2 x i8> [[DIV]])36; CHECK-NEXT: [[ROUNDXDOWNTOMULTIPLEOFY:%.*]] = mul <2 x i8> [[DIV]], [[Y]]37; CHECK-NEXT: [[REM:%.*]] = sub <2 x i8> [[X]], [[ROUNDXDOWNTOMULTIPLEOFY]]38; CHECK-NEXT: ret <2 x i8> [[REM]]39;40 %div = sdiv <2 x i8> %x, %y41 call void @use2xi8(<2 x i8> %div)42 %roundXdownToMultipleOfY = mul <2 x i8> %div, %y43 %rem = sub <2 x i8> %x, %roundXdownToMultipleOfY44 ret <2 x i8> %rem45}46 47; Extra use48 49define i8 @t4_extrause(i8 %x, i8 %y) {50; CHECK-LABEL: @t4_extrause(51; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], [[Y:%.*]]52; CHECK-NEXT: call void @use8(i8 [[DIV]])53; CHECK-NEXT: [[ROUNDXDOWNTOMULTIPLEOFY:%.*]] = mul i8 [[DIV]], [[Y]]54; CHECK-NEXT: call void @use8(i8 [[ROUNDXDOWNTOMULTIPLEOFY]])55; CHECK-NEXT: [[REM:%.*]] = sub i8 [[X]], [[ROUNDXDOWNTOMULTIPLEOFY]]56; CHECK-NEXT: ret i8 [[REM]]57;58 %div = sdiv i8 %x, %y59 call void @use8(i8 %div)60 %roundXdownToMultipleOfY = mul i8 %div, %y61 call void @use8(i8 %roundXdownToMultipleOfY)62 %rem = sub i8 %x, %roundXdownToMultipleOfY63 ret i8 %rem64}65 66; Commutativity67 68declare i8 @gen8()69 70define i8 @t5_commutative(i8 %x) {71; CHECK-LABEL: @t5_commutative(72; CHECK-NEXT: [[Y:%.*]] = call i8 @gen8()73; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], [[Y]]74; CHECK-NEXT: call void @use8(i8 [[DIV]])75; CHECK-NEXT: [[ROUNDXDOWNTOMULTIPLEOFY:%.*]] = mul i8 [[Y]], [[DIV]]76; CHECK-NEXT: [[REM:%.*]] = sub i8 [[X]], [[ROUNDXDOWNTOMULTIPLEOFY]]77; CHECK-NEXT: ret i8 [[REM]]78;79 %y = call i8 @gen8()80 %div = sdiv i8 %x, %y81 call void @use8(i8 %div)82 %roundXdownToMultipleOfY = mul i8 %y, %div ; swapped83 %rem = sub i8 %x, %roundXdownToMultipleOfY84 ret i8 %rem85}86 87; Negative tests88 89define i8 @n6_different_x(i8 %x0, i8 %x1, i8 %y) {90; CHECK-LABEL: @n6_different_x(91; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X0:%.*]], [[Y:%.*]]92; CHECK-NEXT: call void @use8(i8 [[DIV]])93; CHECK-NEXT: [[ROUNDXDOWNTOMULTIPLEOFY:%.*]] = mul i8 [[DIV]], [[Y]]94; CHECK-NEXT: [[REM:%.*]] = sub i8 [[X1:%.*]], [[ROUNDXDOWNTOMULTIPLEOFY]]95; CHECK-NEXT: ret i8 [[REM]]96;97 %div = sdiv i8 %x0, %y98 call void @use8(i8 %div)99 %roundXdownToMultipleOfY = mul i8 %div, %y100 %rem = sub i8 %x1, %roundXdownToMultipleOfY101 ret i8 %rem102}103 104define i8 @n6_different_y(i8 %x, i8 %y0, i8 %y1) {105; CHECK-LABEL: @n6_different_y(106; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], [[Y0:%.*]]107; CHECK-NEXT: call void @use8(i8 [[DIV]])108; CHECK-NEXT: [[ROUNDXDOWNTOMULTIPLEOFY:%.*]] = mul i8 [[DIV]], [[Y1:%.*]]109; CHECK-NEXT: [[REM:%.*]] = sub i8 [[X]], [[ROUNDXDOWNTOMULTIPLEOFY]]110; CHECK-NEXT: ret i8 [[REM]]111;112 %div = sdiv i8 %x, %y0113 call void @use8(i8 %div)114 %roundXdownToMultipleOfY = mul i8 %div, %y1115 %rem = sub i8 %x, %roundXdownToMultipleOfY116 ret i8 %rem117}118