From 34cca2bd4a2daec12f178fd1dd4285dd2ac74f65 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Thu, 6 Oct 2022 09:42:18 -0400 Subject: [PATCH] [InstCombine] add tests for div with common factor; NFC --- llvm/test/Transforms/InstCombine/div-shift.ll | 262 +++++++++++++++++- 1 file changed, 254 insertions(+), 8 deletions(-) diff --git a/llvm/test/Transforms/InstCombine/div-shift.ll b/llvm/test/Transforms/InstCombine/div-shift.ll index 6b3a268066239..804255fd6ca51 100644 --- a/llvm/test/Transforms/InstCombine/div-shift.ll +++ b/llvm/test/Transforms/InstCombine/div-shift.ll @@ -10,13 +10,11 @@ declare i8 @llvm.smax.i8(i8, i8) define i32 @t1(i16 zeroext %x, i32 %y) { ; CHECK-LABEL: @t1( -; CHECK-NEXT: entry: ; CHECK-NEXT: [[CONV:%.*]] = zext i16 [[X:%.*]] to i32 -; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[Y:%.*]], 1 -; CHECK-NEXT: [[D1:%.*]] = lshr i32 [[CONV]], [[TMP0]] +; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[Y:%.*]], 1 +; CHECK-NEXT: [[D1:%.*]] = lshr i32 [[CONV]], [[TMP1]] ; CHECK-NEXT: ret i32 [[D1]] ; -entry: %conv = zext i16 %x to i32 %s = shl i32 2, %y %d = sdiv i32 %conv, %s @@ -25,13 +23,11 @@ entry: define <2 x i32> @t1vec(<2 x i16> %x, <2 x i32> %y) { ; CHECK-LABEL: @t1vec( -; CHECK-NEXT: entry: ; CHECK-NEXT: [[CONV:%.*]] = zext <2 x i16> [[X:%.*]] to <2 x i32> -; CHECK-NEXT: [[TMP0:%.*]] = add <2 x i32> [[Y:%.*]], -; CHECK-NEXT: [[D1:%.*]] = lshr <2 x i32> [[CONV]], [[TMP0]] +; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i32> [[Y:%.*]], +; CHECK-NEXT: [[D1:%.*]] = lshr <2 x i32> [[CONV]], [[TMP1]] ; CHECK-NEXT: ret <2 x i32> [[D1]] ; -entry: %conv = zext <2 x i16> %x to <2 x i32> %s = shl <2 x i32> , %y %d = sdiv <2 x i32> %conv, %s @@ -298,3 +294,253 @@ define <2 x i32> @t16(<2 x i32> %x, <2 x i32> %y) { %r = udiv <2 x i32> %shl, %x ret <2 x i32> %r } + +define i5 @sdiv_mul_shl_nsw(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @sdiv_mul_shl_nsw( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nsw i5 [[X]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = sdiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nsw i5 %x, %y + %m2 = shl nsw i5 %x, %z + %d = sdiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @sdiv_mul_shl_nsw_commute1(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @sdiv_mul_shl_nsw_commute1( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i5 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nsw i5 [[X]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = sdiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nsw i5 %y, %x + %m2 = shl nsw i5 %x, %z + %d = sdiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @sdiv_mul_shl_nsw_commute2(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @sdiv_mul_shl_nsw_commute2( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nsw i5 [[Z:%.*]], [[X]] +; CHECK-NEXT: [[D:%.*]] = sdiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nsw i5 %x, %y + %m2 = shl nsw i5 %z, %x + %d = sdiv i5 %m1, %m2 + ret i5 %d +} + +define i8 @sdiv_mul_shl_nsw_use1(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sdiv_mul_shl_nsw_use1( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: call void @use(i8 [[M1]]) +; CHECK-NEXT: [[M2:%.*]] = shl nsw i8 [[X]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = sdiv i8 [[M1]], [[M2]] +; CHECK-NEXT: ret i8 [[D]] +; + %m1 = mul nsw i8 %x, %y + call void @use(i8 %m1) + %m2 = shl nsw i8 %x, %z + %d = sdiv i8 %m1, %m2 + ret i8 %d +} + +define i8 @sdiv_mul_shl_nsw_use2(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sdiv_mul_shl_nsw_use2( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nsw i8 [[X]], [[Z:%.*]] +; CHECK-NEXT: call void @use(i8 [[M2]]) +; CHECK-NEXT: [[D:%.*]] = sdiv i8 [[M1]], [[M2]] +; CHECK-NEXT: ret i8 [[D]] +; + %m1 = mul nsw i8 %x, %y + %m2 = shl nsw i8 %x, %z + call void @use(i8 %m2) + %d = sdiv i8 %m1, %m2 + ret i8 %d +} + +define i8 @sdiv_mul_shl_nsw_use3(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sdiv_mul_shl_nsw_use3( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: call void @use(i8 [[M1]]) +; CHECK-NEXT: [[M2:%.*]] = shl nsw i8 [[X]], [[Z:%.*]] +; CHECK-NEXT: call void @use(i8 [[M2]]) +; CHECK-NEXT: [[D:%.*]] = sdiv i8 [[M1]], [[M2]] +; CHECK-NEXT: ret i8 [[D]] +; + %m1 = mul nsw i8 %x, %y + call void @use(i8 %m1) + %m2 = shl nsw i8 %x, %z + call void @use(i8 %m2) + %d = sdiv i8 %m1, %m2 + ret i8 %d +} + +define i5 @sdiv_shl_mul_nsw(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @sdiv_shl_mul_nsw( +; CHECK-NEXT: [[M1:%.*]] = shl nsw i5 [[Z:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M2:%.*]] = mul nsw i5 [[X]], [[Y:%.*]] +; CHECK-NEXT: [[D:%.*]] = sdiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = shl nsw i5 %z, %x + %m2 = mul nsw i5 %x, %y + %d = sdiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @sdiv_mul_shl_missing_nsw1(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @sdiv_mul_shl_missing_nsw1( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nuw i5 [[Y]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = sdiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nsw i5 %x, %y + %m2 = shl nuw i5 %y, %z + %d = sdiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @sdiv_mul_shl_missing_nsw2(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @sdiv_mul_shl_missing_nsw2( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nsw i5 [[Y]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = sdiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nuw i5 %x, %y + %m2 = shl nsw i5 %y, %z + %d = sdiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @udiv_mul_shl_nuw(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @udiv_mul_shl_nuw( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nuw i5 [[X]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = udiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nuw i5 %x, %y + %m2 = shl nuw i5 %x, %z + %d = udiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @udiv_mul_shl_nuw_commute1(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @udiv_mul_shl_nuw_commute1( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i5 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nuw i5 [[X]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = udiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nuw i5 %y, %x + %m2 = shl nuw i5 %x, %z + %d = udiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @udiv_mul_shl_nuw_commute2(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @udiv_mul_shl_nuw_commute2( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nuw i5 [[Z:%.*]], [[X]] +; CHECK-NEXT: [[D:%.*]] = udiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nuw i5 %x, %y + %m2 = shl nuw i5 %z, %x + %d = udiv i5 %m1, %m2 + ret i5 %d +} + +define i8 @udiv_mul_shl_nsw_use1(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @udiv_mul_shl_nsw_use1( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: call void @use(i8 [[M1]]) +; CHECK-NEXT: [[M2:%.*]] = shl nuw i8 [[X]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = udiv i8 [[M1]], [[M2]] +; CHECK-NEXT: ret i8 [[D]] +; + %m1 = mul nuw i8 %x, %y + call void @use(i8 %m1) + %m2 = shl nuw i8 %x, %z + %d = udiv i8 %m1, %m2 + ret i8 %d +} + +define i8 @udiv_mul_shl_nsw_use2(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @udiv_mul_shl_nsw_use2( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nuw i8 [[X]], [[Z:%.*]] +; CHECK-NEXT: call void @use(i8 [[M2]]) +; CHECK-NEXT: [[D:%.*]] = udiv i8 [[M1]], [[M2]] +; CHECK-NEXT: ret i8 [[D]] +; + %m1 = mul nuw i8 %x, %y + %m2 = shl nuw i8 %x, %z + call void @use(i8 %m2) + %d = udiv i8 %m1, %m2 + ret i8 %d +} + +define i8 @udiv_mul_shl_nsw_use3(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @udiv_mul_shl_nsw_use3( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: call void @use(i8 [[M1]]) +; CHECK-NEXT: [[M2:%.*]] = shl nuw i8 [[X]], [[Z:%.*]] +; CHECK-NEXT: call void @use(i8 [[M2]]) +; CHECK-NEXT: [[D:%.*]] = udiv i8 [[M1]], [[M2]] +; CHECK-NEXT: ret i8 [[D]] +; + %m1 = mul nuw i8 %x, %y + call void @use(i8 %m1) + %m2 = shl nuw i8 %x, %z + call void @use(i8 %m2) + %d = udiv i8 %m1, %m2 + ret i8 %d +} + +define i5 @udiv_shl_mul_nuw(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @udiv_shl_mul_nuw( +; CHECK-NEXT: [[M1:%.*]] = shl nuw i5 [[Z:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M2:%.*]] = mul nuw i5 [[X]], [[Y:%.*]] +; CHECK-NEXT: [[D:%.*]] = udiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = shl nuw i5 %z, %x + %m2 = mul nuw i5 %x, %y + %d = udiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @udiv_mul_shl_missing_nsw1(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @udiv_mul_shl_missing_nsw1( +; CHECK-NEXT: [[M1:%.*]] = mul nsw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nuw i5 [[Y]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = udiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nsw i5 %x, %y + %m2 = shl nuw i5 %y, %z + %d = udiv i5 %m1, %m2 + ret i5 %d +} + +define i5 @udiv_mul_shl_missing_nsw2(i5 %x, i5 %y, i5 %z) { +; CHECK-LABEL: @udiv_mul_shl_missing_nsw2( +; CHECK-NEXT: [[M1:%.*]] = mul nuw i5 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M2:%.*]] = shl nsw i5 [[Y]], [[Z:%.*]] +; CHECK-NEXT: [[D:%.*]] = udiv i5 [[M1]], [[M2]] +; CHECK-NEXT: ret i5 [[D]] +; + %m1 = mul nuw i5 %x, %y + %m2 = shl nsw i5 %y, %z + %d = udiv i5 %m1, %m2 + ret i5 %d +}