5
5
; RUN: opt < %s -passes=instcombine -S -data-layout="E-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" -use-constant-fp-for-fixed-length-splat -use-constant-int-for-fixed-length-splat | FileCheck %s --check-prefixes=ALL,BE
6
6
; RUN: opt < %s -passes=instcombine -S -data-layout="e-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" -use-constant-fp-for-fixed-length-splat -use-constant-int-for-fixed-length-splat | FileCheck %s --check-prefixes=ALL,LE
7
7
8
+ declare void @use_i8 (i8 )
8
9
declare void @use_i32 (i32 )
9
10
declare void @use_v2i32 (<2 x i32 >)
10
11
@@ -2041,6 +2042,120 @@ define <2 x i8> @trunc_lshr_zext_uses1(<2 x i8> %A) {
2041
2042
ret <2 x i8 > %D
2042
2043
}
2043
2044
2045
+ define i8 @trunc_lshr_ext_halfWidth (i16 %a , i16 %b , i16 range(i16 0 , 8 ) %shiftAmt ) {
2046
+ ; ALL-LABEL: @trunc_lshr_ext_halfWidth(
2047
+ ; ALL-NEXT: [[ADD:%.*]] = add i16 [[A:%.*]], [[B:%.*]]
2048
+ ; ALL-NEXT: [[SHR:%.*]] = lshr i16 [[ADD]], [[SHIFTAMT:%.*]]
2049
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i16 [[SHR]] to i8
2050
+ ; ALL-NEXT: ret i8 [[TRUNC]]
2051
+ ;
2052
+ %zext_a = zext i16 %a to i32
2053
+ %zext_b = zext i16 %b to i32
2054
+ %zext_shiftAmt = zext i16 %shiftAmt to i32
2055
+ %add = add nuw nsw i32 %zext_a , %zext_b
2056
+ %shr = lshr i32 %add , %zext_shiftAmt
2057
+ %trunc = trunc i32 %shr to i8
2058
+ ret i8 %trunc
2059
+ }
2060
+
2061
+ define i8 @trunc_lshr_ext_halfWidth_rhsOutofRange_neg (i16 %a , i16 %b , i16 range(i16 0 , 10 ) %shiftAmt ) {
2062
+ ; ALL-LABEL: @trunc_lshr_ext_halfWidth_rhsOutofRange_neg(
2063
+ ; ALL-NEXT: [[ZEXT_A:%.*]] = zext i16 [[A:%.*]] to i32
2064
+ ; ALL-NEXT: [[ZEXT_B:%.*]] = zext i16 [[B:%.*]] to i32
2065
+ ; ALL-NEXT: [[ZEXT_SHIFTAMT:%.*]] = zext nneg i16 [[SHIFTAMT:%.*]] to i32
2066
+ ; ALL-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[ZEXT_A]], [[ZEXT_B]]
2067
+ ; ALL-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], [[ZEXT_SHIFTAMT]]
2068
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8
2069
+ ; ALL-NEXT: ret i8 [[TRUNC]]
2070
+ ;
2071
+ %zext_a = zext i16 %a to i32
2072
+ %zext_b = zext i16 %b to i32
2073
+ %zext_shiftAmt = zext i16 %shiftAmt to i32
2074
+ %add = add nuw nsw i32 %zext_a , %zext_b
2075
+ %shr = lshr i32 %add , %zext_shiftAmt
2076
+ %trunc = trunc i32 %shr to i8
2077
+ ret i8 %trunc
2078
+ }
2079
+
2080
+ define i8 @trunc_lshr_ext_halfWidth_rhsNoRange_neg (i16 %a , i16 %b , i16 %shiftAmt ) {
2081
+ ; ALL-LABEL: @trunc_lshr_ext_halfWidth_rhsNoRange_neg(
2082
+ ; ALL-NEXT: [[ZEXT_A:%.*]] = zext i16 [[A:%.*]] to i32
2083
+ ; ALL-NEXT: [[ZEXT_B:%.*]] = zext i16 [[B:%.*]] to i32
2084
+ ; ALL-NEXT: [[ZEXT_SHIFTAMT:%.*]] = zext nneg i16 [[SHIFTAMT:%.*]] to i32
2085
+ ; ALL-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[ZEXT_A]], [[ZEXT_B]]
2086
+ ; ALL-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], [[ZEXT_SHIFTAMT]]
2087
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8
2088
+ ; ALL-NEXT: ret i8 [[TRUNC]]
2089
+ ;
2090
+ %zext_a = zext i16 %a to i32
2091
+ %zext_b = zext i16 %b to i32
2092
+ %zext_shiftAmt = zext i16 %shiftAmt to i32
2093
+ %add = add nuw nsw i32 %zext_a , %zext_b
2094
+ %shr = lshr i32 %add , %zext_shiftAmt
2095
+ %trunc = trunc i32 %shr to i8
2096
+ ret i8 %trunc
2097
+ }
2098
+
2099
+ define i8 @trunc_lshr_ext_halfWidth_twouse_neg1 (i16 %a , i16 %b , i16 range(i16 0 , 8 ) %shiftAmt ) {
2100
+ ; ALL-LABEL: @trunc_lshr_ext_halfWidth_twouse_neg1(
2101
+ ; ALL-NEXT: [[ZEXT_A:%.*]] = zext i16 [[A:%.*]] to i32
2102
+ ; ALL-NEXT: [[ZEXT_B:%.*]] = zext i16 [[B:%.*]] to i32
2103
+ ; ALL-NEXT: [[ZEXT_SHIFTAMT:%.*]] = zext nneg i16 [[SHIFTAMT:%.*]] to i32
2104
+ ; ALL-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[ZEXT_A]], [[ZEXT_B]]
2105
+ ; ALL-NEXT: call void @use_i32(i32 [[ADD]])
2106
+ ; ALL-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], [[ZEXT_SHIFTAMT]]
2107
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8
2108
+ ; ALL-NEXT: ret i8 [[TRUNC]]
2109
+ ;
2110
+ %zext_a = zext i16 %a to i32
2111
+ %zext_b = zext i16 %b to i32
2112
+ %zext_shiftAmt = zext i16 %shiftAmt to i32
2113
+ %add = add nuw nsw i32 %zext_a , %zext_b
2114
+ call void @use_i32 (i32 %add )
2115
+ %shr = lshr i32 %add , %zext_shiftAmt
2116
+ %trunc = trunc i32 %shr to i8
2117
+ ret i8 %trunc
2118
+ }
2119
+
2120
+ define i8 @trunc_lshr_ext_halfWidth_twouse_neg2 (i16 %a , i16 %b , i16 range(i16 0 , 8 ) %shiftAmt ) {
2121
+ ; ALL-LABEL: @trunc_lshr_ext_halfWidth_twouse_neg2(
2122
+ ; ALL-NEXT: [[ZEXT_A:%.*]] = zext i16 [[A:%.*]] to i32
2123
+ ; ALL-NEXT: [[ZEXT_B:%.*]] = zext i16 [[B:%.*]] to i32
2124
+ ; ALL-NEXT: [[ZEXT_SHIFTAMT:%.*]] = zext nneg i16 [[SHIFTAMT:%.*]] to i32
2125
+ ; ALL-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[ZEXT_A]], [[ZEXT_B]]
2126
+ ; ALL-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], [[ZEXT_SHIFTAMT]]
2127
+ ; ALL-NEXT: call void @use_i32(i32 [[SHR]])
2128
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8
2129
+ ; ALL-NEXT: ret i8 [[TRUNC]]
2130
+ ;
2131
+ %zext_a = zext i16 %a to i32
2132
+ %zext_b = zext i16 %b to i32
2133
+ %zext_shiftAmt = zext i16 %shiftAmt to i32
2134
+ %add = add nuw nsw i32 %zext_a , %zext_b
2135
+ %shr = lshr i32 %add , %zext_shiftAmt
2136
+ call void @use_i32 (i32 %shr )
2137
+ %trunc = trunc i32 %shr to i8
2138
+ ret i8 %trunc
2139
+ }
2140
+
2141
+ ; The narrowing transform only happens for integer types.
2142
+ define <2 x i8 > @trunc_lshr_ext_halfWidth_vector_neg (<2 x i16 > %a , <2 x i16 > %b ) {
2143
+ ; ALL-LABEL: @trunc_lshr_ext_halfWidth_vector_neg(
2144
+ ; ALL-NEXT: [[ZEXT_A:%.*]] = zext <2 x i16> [[A:%.*]] to <2 x i32>
2145
+ ; ALL-NEXT: [[ZEXT_B:%.*]] = zext <2 x i16> [[B:%.*]] to <2 x i32>
2146
+ ; ALL-NEXT: [[ADD:%.*]] = add nuw nsw <2 x i32> [[ZEXT_A]], [[ZEXT_B]]
2147
+ ; ALL-NEXT: [[SHR:%.*]] = lshr <2 x i32> [[ADD]], splat (i32 6)
2148
+ ; ALL-NEXT: [[TRUNC:%.*]] = trunc <2 x i32> [[SHR]] to <2 x i8>
2149
+ ; ALL-NEXT: ret <2 x i8> [[TRUNC]]
2150
+ ;
2151
+ %zext_a = zext <2 x i16 > %a to <2 x i32 >
2152
+ %zext_b = zext <2 x i16 > %b to <2 x i32 >
2153
+ %add = add nuw nsw <2 x i32 > %zext_a , %zext_b
2154
+ %shr = lshr <2 x i32 > %add , <i32 6 , i32 6 >
2155
+ %trunc = trunc <2 x i32 > %shr to <2 x i8 >
2156
+ ret <2 x i8 > %trunc
2157
+ }
2158
+
2044
2159
; The following four tests sext + lshr + trunc patterns.
2045
2160
; PR33078
2046
2161
0 commit comments