[llvm] 7767f0d - [InstCombine] Add test for #95547 (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 17 06:39:09 PDT 2024
Author: Nikita Popov
Date: 2024-06-17T15:38:59+02:00
New Revision: 7767f0d47428db66d65b07b35aa52f0507df71f9
URL: https://github.com/llvm/llvm-project/commit/7767f0d47428db66d65b07b35aa52f0507df71f9
DIFF: https://github.com/llvm/llvm-project/commit/7767f0d47428db66d65b07b35aa52f0507df71f9.diff
LOG: [InstCombine] Add test for #95547 (NFC)
Added:
Modified:
llvm/test/Transforms/InstCombine/trunc.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/trunc.ll b/llvm/test/Transforms/InstCombine/trunc.ll
index a180c3d52f6ab..32e3a5d1f7691 100644
--- a/llvm/test/Transforms/InstCombine/trunc.ll
+++ b/llvm/test/Transforms/InstCombine/trunc.ll
@@ -5,6 +5,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
; Instcombine should be able to eliminate all of these ext casts.
declare void @use(i32)
+declare void @use.i8(i8)
declare void @use_vec(<2 x i32>)
define i64 @test1(i64 %a) {
@@ -217,8 +218,8 @@ define i16 @ashr_mul(i8 %X, i8 %Y) {
define i32 @trunc_ashr(i32 %X) {
; CHECK-LABEL: @trunc_ashr(
; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8
-; CHECK-NEXT: [[C:%.*]] = or i32 [[TMP1]], -8388608
-; CHECK-NEXT: ret i32 [[C]]
+; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], -8388608
+; CHECK-NEXT: ret i32 [[TMP2]]
;
%A = zext i32 %X to i36
%B = or i36 %A, -2147483648 ; 0xF80000000
@@ -230,8 +231,8 @@ define i32 @trunc_ashr(i32 %X) {
define <2 x i32> @trunc_ashr_vec(<2 x i32> %X) {
; CHECK-LABEL: @trunc_ashr_vec(
; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 8, i32 8>
-; CHECK-NEXT: [[C:%.*]] = or <2 x i32> [[TMP1]], <i32 -8388608, i32 -8388608>
-; CHECK-NEXT: ret <2 x i32> [[C]]
+; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i32> [[TMP1]], <i32 -8388608, i32 -8388608>
+; CHECK-NEXT: ret <2 x i32> [[TMP2]]
;
%A = zext <2 x i32> %X to <2 x i36>
%B = or <2 x i36> %A, <i36 -2147483648, i36 -2147483648> ; 0xF80000000
@@ -305,8 +306,8 @@ define <2 x i64> @test8_vec_poison(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = zext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[D:%.*]] = zext <2 x i32> [[B:%.*]] to <2 x i64>
; CHECK-NEXT: [[E:%.*]] = shl nuw <2 x i64> [[D]], <i64 32, i64 poison>
-; CHECK-NEXT: [[G:%.*]] = or disjoint <2 x i64> [[E]], [[C]]
-; CHECK-NEXT: ret <2 x i64> [[G]]
+; CHECK-NEXT: [[F:%.*]] = or disjoint <2 x i64> [[E]], [[C]]
+; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = zext <2 x i32> %A to <2 x i128>
%D = zext <2 x i32> %B to <2 x i128>
@@ -392,8 +393,8 @@ define <2 x i64> @test11_vec_poison(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = zext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[B:%.*]], <i32 31, i32 poison>
; CHECK-NEXT: [[E:%.*]] = zext nneg <2 x i32> [[TMP1]] to <2 x i64>
-; CHECK-NEXT: [[G:%.*]] = shl nuw nsw <2 x i64> [[C]], [[E]]
-; CHECK-NEXT: ret <2 x i64> [[G]]
+; CHECK-NEXT: [[F:%.*]] = shl nuw nsw <2 x i64> [[C]], [[E]]
+; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = zext <2 x i32> %A to <2 x i128>
%D = zext <2 x i32> %B to <2 x i128>
@@ -456,8 +457,8 @@ define <2 x i64> @test12_vec_poison(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = zext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[B:%.*]], <i32 31, i32 poison>
; CHECK-NEXT: [[E:%.*]] = zext nneg <2 x i32> [[TMP1]] to <2 x i64>
-; CHECK-NEXT: [[G:%.*]] = lshr <2 x i64> [[C]], [[E]]
-; CHECK-NEXT: ret <2 x i64> [[G]]
+; CHECK-NEXT: [[F:%.*]] = lshr <2 x i64> [[C]], [[E]]
+; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = zext <2 x i32> %A to <2 x i128>
%D = zext <2 x i32> %B to <2 x i128>
@@ -520,8 +521,8 @@ define <2 x i64> @test13_vec_poison(<2 x i32> %A, <2 x i32> %B) {
; CHECK-NEXT: [[C:%.*]] = sext <2 x i32> [[A:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[B:%.*]], <i32 31, i32 poison>
; CHECK-NEXT: [[E:%.*]] = zext nneg <2 x i32> [[TMP1]] to <2 x i64>
-; CHECK-NEXT: [[G:%.*]] = ashr <2 x i64> [[C]], [[E]]
-; CHECK-NEXT: ret <2 x i64> [[G]]
+; CHECK-NEXT: [[F:%.*]] = ashr <2 x i64> [[C]], [[E]]
+; CHECK-NEXT: ret <2 x i64> [[F]]
;
%C = sext <2 x i32> %A to <2 x i128>
%D = zext <2 x i32> %B to <2 x i128>
@@ -1034,8 +1035,8 @@ define i8 @drop_nsw_trunc(i16 %x, i16 %y) {
define i8 @drop_nuw_trunc(i16 %x, i16 %y) {
; CHECK-LABEL: @drop_nuw_trunc(
; CHECK-NEXT: [[AND2:%.*]] = and i16 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[B:%.*]] = trunc i16 [[AND2]] to i8
-; CHECK-NEXT: ret i8 [[B]]
+; CHECK-NEXT: [[RES:%.*]] = trunc i16 [[AND2]] to i8
+; CHECK-NEXT: ret i8 [[RES]]
;
%and = and i16 %x, 255
%and2 = and i16 %and, %y
@@ -1095,3 +1096,31 @@ define <2 x i1> @trunc_nuw_xor_vector(<2 x i8> %x, <2 x i8> %y) {
%r = trunc nuw <2 x i8> %xor to <2 x i1>
ret <2 x i1> %r
}
+
+; FIXME: This is a miscompile.
+define void @pr95547(i32 %x) {
+; CHECK-LABEL: @pr95547(
+; CHECK-NEXT: [[X_TRUNC:%.*]] = trunc i32 [[X:%.*]] to i8
+; CHECK-NEXT: [[DIV:%.*]] = udiv i8 11, [[X_TRUNC]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], 256
+; CHECK-NEXT: br i1 [[CMP]], label [[LOOP:%.*]], label [[EXIT:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: call void @use.i8(i8 [[DIV]])
+; CHECK-NEXT: br label [[LOOP]]
+; CHECK: exit:
+; CHECK-NEXT: ret void
+;
+ %x.trunc = trunc i32 %x to i16
+ %div = udiv i16 11, %x.trunc
+ %cmp = icmp ult i32 %x, 256
+ br i1 %cmp, label %loop, label %exit
+
+loop:
+ ; The loop is just here to prevent sinking.
+ %trunc = trunc i16 %div to i8
+ call void @use.i8(i8 %trunc)
+ br label %loop
+
+exit:
+ ret void
+}
More information about the llvm-commits
mailing list