[llvm] 2af4f1a - [InstCombine] add tests for udiv/urem miscompile; NFC

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 29 13:35:13 PDT 2022


Author: Sanjay Patel
Date: 2022-07-29T16:35:04-04:00
New Revision: 2af4f1a479d6e68fc0b30c92707fbb738fe726b8

URL: https://github.com/llvm/llvm-project/commit/2af4f1a479d6e68fc0b30c92707fbb738fe726b8
DIFF: https://github.com/llvm/llvm-project/commit/2af4f1a479d6e68fc0b30c92707fbb738fe726b8.diff

LOG: [InstCombine] add tests for udiv/urem miscompile; NFC

See issue #56810

Added: 
    

Modified: 
    llvm/test/Transforms/InstCombine/udivrem-change-width.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/udivrem-change-width.ll b/llvm/test/Transforms/InstCombine/udivrem-change-width.ll
index 2eee0314cd9c..522950257b11 100644
--- a/llvm/test/Transforms/InstCombine/udivrem-change-width.ll
+++ b/llvm/test/Transforms/InstCombine/udivrem-change-width.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
 
 target datalayout = "n8:32"
@@ -5,8 +6,8 @@ target datalayout = "n8:32"
 ; PR4548
 define i8 @udiv_i8(i8 %a, i8 %b) {
 ; CHECK-LABEL: @udiv_i8(
-; CHECK-NEXT:    [[DIV:%.*]] = udiv i8 %a, %b
-; CHECK-NEXT:    ret i8 [[DIV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    ret i8 [[TMP1]]
 ;
   %za = zext i8 %a to i32
   %zb = zext i8 %b to i32
@@ -17,8 +18,8 @@ define i8 @udiv_i8(i8 %a, i8 %b) {
 
 define <2 x i8> @udiv_i8_vec(<2 x i8> %a, <2 x i8> %b) {
 ; CHECK-LABEL: @udiv_i8_vec(
-; CHECK-NEXT:    [[DIV:%.*]] = udiv <2 x i8> %a, %b
-; CHECK-NEXT:    ret <2 x i8> [[DIV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv <2 x i8> [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    ret <2 x i8> [[TMP1]]
 ;
   %za = zext <2 x i8> %a to <2 x i32>
   %zb = zext <2 x i8> %b to <2 x i32>
@@ -29,7 +30,7 @@ define <2 x i8> @udiv_i8_vec(<2 x i8> %a, <2 x i8> %b) {
 
 define i8 @urem_i8(i8 %a, i8 %b) {
 ; CHECK-LABEL: @urem_i8(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 %a, %b
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 [[A:%.*]], [[B:%.*]]
 ; CHECK-NEXT:    ret i8 [[TMP1]]
 ;
   %za = zext i8 %a to i32
@@ -41,7 +42,7 @@ define i8 @urem_i8(i8 %a, i8 %b) {
 
 define <2 x i8> @urem_i8_vec(<2 x i8> %a, <2 x i8> %b) {
 ; CHECK-LABEL: @urem_i8_vec(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem <2 x i8> %a, %b
+; CHECK-NEXT:    [[TMP1:%.*]] = urem <2 x i8> [[A:%.*]], [[B:%.*]]
 ; CHECK-NEXT:    ret <2 x i8> [[TMP1]]
 ;
   %za = zext <2 x i8> %a to <2 x i32>
@@ -53,8 +54,8 @@ define <2 x i8> @urem_i8_vec(<2 x i8> %a, <2 x i8> %b) {
 
 define i32 @udiv_i32(i8 %a, i8 %b) {
 ; CHECK-LABEL: @udiv_i32(
-; CHECK-NEXT:    [[DIV:%.*]] = udiv i8 %a, %b
-; CHECK-NEXT:    [[UDIV:%.*]] = zext i8 [[DIV]] to i32
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[UDIV:%.*]] = zext i8 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UDIV]]
 ;
   %za = zext i8 %a to i32
@@ -65,8 +66,8 @@ define i32 @udiv_i32(i8 %a, i8 %b) {
 
 define <2 x i32> @udiv_i32_vec(<2 x i8> %a, <2 x i8> %b) {
 ; CHECK-LABEL: @udiv_i32_vec(
-; CHECK-NEXT:    [[DIV:%.*]] = udiv <2 x i8> %a, %b
-; CHECK-NEXT:    [[UDIV:%.*]] = zext <2 x i8> [[DIV]] to <2 x i32>
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv <2 x i8> [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[UDIV:%.*]] = zext <2 x i8> [[TMP1]] to <2 x i32>
 ; CHECK-NEXT:    ret <2 x i32> [[UDIV]]
 ;
   %za = zext <2 x i8> %a to <2 x i32>
@@ -77,8 +78,8 @@ define <2 x i32> @udiv_i32_vec(<2 x i8> %a, <2 x i8> %b) {
 
 define i32 @udiv_i32_multiuse(i8 %a, i8 %b) {
 ; CHECK-LABEL: @udiv_i32_multiuse(
-; CHECK-NEXT:    [[ZA:%.*]] = zext i8 %a to i32
-; CHECK-NEXT:    [[ZB:%.*]] = zext i8 %b to i32
+; CHECK-NEXT:    [[ZA:%.*]] = zext i8 [[A:%.*]] to i32
+; CHECK-NEXT:    [[ZB:%.*]] = zext i8 [[B:%.*]] to i32
 ; CHECK-NEXT:    [[UDIV:%.*]] = udiv i32 [[ZA]], [[ZB]]
 ; CHECK-NEXT:    [[EXTRA_USES:%.*]] = add nuw nsw i32 [[ZA]], [[ZB]]
 ; CHECK-NEXT:    [[R:%.*]] = mul nuw nsw i32 [[UDIV]], [[EXTRA_USES]]
@@ -94,8 +95,8 @@ define i32 @udiv_i32_multiuse(i8 %a, i8 %b) {
 
 define i32 @udiv_illegal_type(i9 %a, i9 %b) {
 ; CHECK-LABEL: @udiv_illegal_type(
-; CHECK-NEXT:    [[DIV:%.*]] = udiv i9 %a, %b
-; CHECK-NEXT:    [[UDIV:%.*]] = zext i9 [[DIV]] to i32
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i9 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[UDIV:%.*]] = zext i9 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UDIV]]
 ;
   %za = zext i9 %a to i32
@@ -106,7 +107,7 @@ define i32 @udiv_illegal_type(i9 %a, i9 %b) {
 
 define i32 @urem_i32(i8 %a, i8 %b) {
 ; CHECK-LABEL: @urem_i32(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 %a, %b
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 [[A:%.*]], [[B:%.*]]
 ; CHECK-NEXT:    [[UREM:%.*]] = zext i8 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UREM]]
 ;
@@ -118,7 +119,7 @@ define i32 @urem_i32(i8 %a, i8 %b) {
 
 define <2 x i32> @urem_i32_vec(<2 x i8> %a, <2 x i8> %b) {
 ; CHECK-LABEL: @urem_i32_vec(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem <2 x i8> %a, %b
+; CHECK-NEXT:    [[TMP1:%.*]] = urem <2 x i8> [[A:%.*]], [[B:%.*]]
 ; CHECK-NEXT:    [[UREM:%.*]] = zext <2 x i8> [[TMP1]] to <2 x i32>
 ; CHECK-NEXT:    ret <2 x i32> [[UREM]]
 ;
@@ -130,8 +131,8 @@ define <2 x i32> @urem_i32_vec(<2 x i8> %a, <2 x i8> %b) {
 
 define i32 @urem_i32_multiuse(i8 %a, i8 %b) {
 ; CHECK-LABEL: @urem_i32_multiuse(
-; CHECK-NEXT:    [[ZA:%.*]] = zext i8 %a to i32
-; CHECK-NEXT:    [[ZB:%.*]] = zext i8 %b to i32
+; CHECK-NEXT:    [[ZA:%.*]] = zext i8 [[A:%.*]] to i32
+; CHECK-NEXT:    [[ZB:%.*]] = zext i8 [[B:%.*]] to i32
 ; CHECK-NEXT:    [[UREM:%.*]] = urem i32 [[ZA]], [[ZB]]
 ; CHECK-NEXT:    [[EXTRA_USES:%.*]] = add nuw nsw i32 [[ZA]], [[ZB]]
 ; CHECK-NEXT:    [[R:%.*]] = mul nuw nsw i32 [[UREM]], [[EXTRA_USES]]
@@ -147,7 +148,7 @@ define i32 @urem_i32_multiuse(i8 %a, i8 %b) {
 
 define i32 @urem_illegal_type(i9 %a, i9 %b) {
 ; CHECK-LABEL: @urem_illegal_type(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem i9 %a, %b
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i9 [[A:%.*]], [[B:%.*]]
 ; CHECK-NEXT:    [[UREM:%.*]] = zext i9 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UREM]]
 ;
@@ -159,8 +160,8 @@ define i32 @urem_illegal_type(i9 %a, i9 %b) {
 
 define i32 @udiv_i32_c(i8 %a) {
 ; CHECK-LABEL: @udiv_i32_c(
-; CHECK-NEXT:    [[DIV:%.*]] = udiv i8 %a, 10
-; CHECK-NEXT:    [[UDIV:%.*]] = zext i8 [[DIV]] to i32
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 [[A:%.*]], 10
+; CHECK-NEXT:    [[UDIV:%.*]] = zext i8 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UDIV]]
 ;
   %za = zext i8 %a to i32
@@ -170,7 +171,7 @@ define i32 @udiv_i32_c(i8 %a) {
 
 define <2 x i32> @udiv_i32_c_vec(<2 x i8> %a) {
 ; CHECK-LABEL: @udiv_i32_c_vec(
-; CHECK-NEXT:    [[TMP1:%.*]] = udiv <2 x i8> %a, <i8 10, i8 17>
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv <2 x i8> [[A:%.*]], <i8 10, i8 17>
 ; CHECK-NEXT:    [[UDIV:%.*]] = zext <2 x i8> [[TMP1]] to <2 x i32>
 ; CHECK-NEXT:    ret <2 x i32> [[UDIV]]
 ;
@@ -181,7 +182,7 @@ define <2 x i32> @udiv_i32_c_vec(<2 x i8> %a) {
 
 define i32 @udiv_i32_c_multiuse(i8 %a) {
 ; CHECK-LABEL: @udiv_i32_c_multiuse(
-; CHECK-NEXT:    [[ZA:%.*]] = zext i8 %a to i32
+; CHECK-NEXT:    [[ZA:%.*]] = zext i8 [[A:%.*]] to i32
 ; CHECK-NEXT:    [[UDIV:%.*]] = udiv i32 [[ZA]], 10
 ; CHECK-NEXT:    [[EXTRA_USE:%.*]] = add nuw nsw i32 [[UDIV]], [[ZA]]
 ; CHECK-NEXT:    ret i32 [[EXTRA_USE]]
@@ -194,8 +195,8 @@ define i32 @udiv_i32_c_multiuse(i8 %a) {
 
 define i32 @udiv_illegal_type_c(i9 %a) {
 ; CHECK-LABEL: @udiv_illegal_type_c(
-; CHECK-NEXT:    [[DIV:%.*]] = udiv i9 %a, 10
-; CHECK-NEXT:    [[UDIV:%.*]] = zext i9 [[DIV]] to i32
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i9 [[A:%.*]], 10
+; CHECK-NEXT:    [[UDIV:%.*]] = zext i9 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UDIV]]
 ;
   %za = zext i9 %a to i32
@@ -205,7 +206,7 @@ define i32 @udiv_illegal_type_c(i9 %a) {
 
 define i32 @urem_i32_c(i8 %a) {
 ; CHECK-LABEL: @urem_i32_c(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 %a, 10
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 [[A:%.*]], 10
 ; CHECK-NEXT:    [[UREM:%.*]] = zext i8 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UREM]]
 ;
@@ -216,7 +217,7 @@ define i32 @urem_i32_c(i8 %a) {
 
 define <2 x i32> @urem_i32_c_vec(<2 x i8> %a) {
 ; CHECK-LABEL: @urem_i32_c_vec(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem <2 x i8> %a, <i8 10, i8 17>
+; CHECK-NEXT:    [[TMP1:%.*]] = urem <2 x i8> [[A:%.*]], <i8 10, i8 17>
 ; CHECK-NEXT:    [[UREM:%.*]] = zext <2 x i8> [[TMP1]] to <2 x i32>
 ; CHECK-NEXT:    ret <2 x i32> [[UREM]]
 ;
@@ -227,7 +228,7 @@ define <2 x i32> @urem_i32_c_vec(<2 x i8> %a) {
 
 define i32 @urem_i32_c_multiuse(i8 %a) {
 ; CHECK-LABEL: @urem_i32_c_multiuse(
-; CHECK-NEXT:    [[ZA:%.*]] = zext i8 %a to i32
+; CHECK-NEXT:    [[ZA:%.*]] = zext i8 [[A:%.*]] to i32
 ; CHECK-NEXT:    [[UREM:%.*]] = urem i32 [[ZA]], 10
 ; CHECK-NEXT:    [[EXTRA_USE:%.*]] = add nuw nsw i32 [[UREM]], [[ZA]]
 ; CHECK-NEXT:    ret i32 [[EXTRA_USE]]
@@ -240,7 +241,7 @@ define i32 @urem_i32_c_multiuse(i8 %a) {
 
 define i32 @urem_illegal_type_c(i9 %a) {
 ; CHECK-LABEL: @urem_illegal_type_c(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem i9 %a, 10
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i9 [[A:%.*]], 10
 ; CHECK-NEXT:    [[UREM:%.*]] = zext i9 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UREM]]
 ;
@@ -251,7 +252,7 @@ define i32 @urem_illegal_type_c(i9 %a) {
 
 define i32 @udiv_c_i32(i8 %a) {
 ; CHECK-LABEL: @udiv_c_i32(
-; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 10, %a
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 10, [[A:%.*]]
 ; CHECK-NEXT:    [[UDIV:%.*]] = zext i8 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UDIV]]
 ;
@@ -262,7 +263,7 @@ define i32 @udiv_c_i32(i8 %a) {
 
 define i32 @urem_c_i32(i8 %a) {
 ; CHECK-LABEL: @urem_c_i32(
-; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 10, %a
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 10, [[A:%.*]]
 ; CHECK-NEXT:    [[UREM:%.*]] = zext i8 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[UREM]]
 ;
@@ -277,7 +278,7 @@ define i32 @urem_c_i32(i8 %a) {
 
 define i32 @udiv_constexpr(i8 %a) {
 ; CHECK-LABEL: @udiv_constexpr(
-; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 %a, ptrtoint ([1 x i8]* @b to i8)
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 [[A:%.*]], ptrtoint ([1 x i8]* @b to i8)
 ; CHECK-NEXT:    [[D:%.*]] = zext i8 [[TMP1]] to i32
 ; CHECK-NEXT:    ret i32 [[D]]
 ;
@@ -286,3 +287,54 @@ define i32 @udiv_constexpr(i8 %a) {
   ret i32 %d
 }
 
+; FIXME: This is a miscompile (minimal form of PR56810)
+
+ at g1 = external global [1 x i8]
+
+define i32 @udiv_const_constexpr(i8 %a) {
+; CHECK-LABEL: @udiv_const_constexpr(
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 ptrtoint ([1 x i8]* @g1 to i8), 42
+; CHECK-NEXT:    [[D:%.*]] = zext i8 [[TMP1]] to i32
+; CHECK-NEXT:    ret i32 [[D]]
+;
+  %d = udiv i32 42, zext (i8 ptrtoint ([1 x i8]* @g1 to i8) to i32)
+  ret i32 %d
+}
+
+; FIXME: This is a miscompile (minimal form of PR56810)
+
+ at g2 = external global [1 x i8]
+
+define i32 @urem_const_constexpr(i8 %a) {
+; CHECK-LABEL: @urem_const_constexpr(
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 ptrtoint ([1 x i8]* @g2 to i8), 42
+; CHECK-NEXT:    [[D:%.*]] = zext i8 [[TMP1]] to i32
+; CHECK-NEXT:    ret i32 [[D]]
+;
+  %d = urem i32 42, zext (i8 ptrtoint ([1 x i8]* @g2 to i8) to i32)
+  ret i32 %d
+}
+
+ at g3 = external global [1 x i8]
+
+define i32 @udiv_constexpr_const(i8 %a) {
+; CHECK-LABEL: @udiv_constexpr_const(
+; CHECK-NEXT:    [[TMP1:%.*]] = udiv i8 ptrtoint ([1 x i8]* @g3 to i8), 42
+; CHECK-NEXT:    [[D:%.*]] = zext i8 [[TMP1]] to i32
+; CHECK-NEXT:    ret i32 [[D]]
+;
+  %d = udiv i32 zext (i8 ptrtoint ([1 x i8]* @g3 to i8) to i32), 42
+  ret i32 %d
+}
+
+ at g4 = external global [1 x i8]
+
+define i32 @urem_constexpr_const(i8 %a) {
+; CHECK-LABEL: @urem_constexpr_const(
+; CHECK-NEXT:    [[TMP1:%.*]] = urem i8 ptrtoint ([1 x i8]* @g4 to i8), 42
+; CHECK-NEXT:    [[D:%.*]] = zext i8 [[TMP1]] to i32
+; CHECK-NEXT:    ret i32 [[D]]
+;
+  %d = urem i32 zext (i8 ptrtoint ([1 x i8]* @g4 to i8) to i32), 42
+  ret i32 %d
+}


        


More information about the llvm-commits mailing list