@@ -1900,6 +1900,112 @@ define i1 @icmp_add1_sle(i32 %x, i32 %y) {
19001900 ret i1 %cmp
19011901}
19021902
1903+ define i1 @icmp_slt_offset_with_common_divisor (i64 %x , i64 %y ) {
1904+ ; CHECK-LABEL: @icmp_slt_offset_with_common_divisor(
1905+ ; CHECK-NEXT: [[SHLX:%.*]] = shl i64 [[X:%.*]], 4
1906+ ; CHECK-NEXT: [[SHLY:%.*]] = shl i64 [[Y:%.*]], 4
1907+ ; CHECK-NEXT: [[SHLX_OFFSET:%.*]] = add nsw i64 [[SHLX]], -16
1908+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[SHLX_OFFSET]], [[SHLY]]
1909+ ; CHECK-NEXT: ret i1 [[CMP]]
1910+ ;
1911+ %shlx = shl i64 %x , 4
1912+ %shly = shl i64 %y , 4
1913+ %shlx_offset = add nsw i64 %shlx , -16
1914+ %cmp = icmp slt i64 %shlx_offset , %shly
1915+ ret i1 %cmp
1916+ }
1917+
1918+ define i1 @icmp_slt_offset_with_smaller_common_divisor (i64 %x , i64 %y ) {
1919+ ; CHECK-LABEL: @icmp_slt_offset_with_smaller_common_divisor(
1920+ ; CHECK-NEXT: [[SHLX:%.*]] = shl i64 [[X:%.*]], 4
1921+ ; CHECK-NEXT: [[SHLY:%.*]] = shl i64 [[Y:%.*]], 4
1922+ ; CHECK-NEXT: [[SHLX_OFFSET:%.*]] = add nsw i64 [[SHLX]], -8
1923+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[SHLX_OFFSET]], [[SHLY]]
1924+ ; CHECK-NEXT: ret i1 [[CMP]]
1925+ ;
1926+ %shlx = shl i64 %x , 4
1927+ %shly = shl i64 %y , 4
1928+ %shlx_offset = add nsw i64 %shlx , -8
1929+ %cmp = icmp slt i64 %shlx_offset , %shly
1930+ ret i1 %cmp
1931+ }
1932+
1933+ define i1 @icmp_sle_offset_with_common_divisor (i64 %x , i64 %y ) {
1934+ ; CHECK-LABEL: @icmp_sle_offset_with_common_divisor(
1935+ ; CHECK-NEXT: [[SHLX:%.*]] = shl i64 [[X:%.*]], 4
1936+ ; CHECK-NEXT: [[SHLY:%.*]] = shl i64 [[Y:%.*]], 4
1937+ ; CHECK-NEXT: [[SHLX_OFFSET:%.*]] = add nsw i64 [[SHLX]], 16
1938+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i64 [[SHLX_OFFSET]], [[SHLY]]
1939+ ; CHECK-NEXT: ret i1 [[CMP]]
1940+ ;
1941+ %shlx = shl i64 %x , 4
1942+ %shly = shl i64 %y , 4
1943+ %shlx_offset = add nsw i64 %shlx , 16
1944+ %cmp = icmp sle i64 %shlx_offset , %shly
1945+ ret i1 %cmp
1946+ }
1947+
1948+ define i1 @icmp_ule_offset_with_common_divisor (i64 %x , i64 %y ) {
1949+ ; CHECK-LABEL: @icmp_ule_offset_with_common_divisor(
1950+ ; CHECK-NEXT: [[SHLX:%.*]] = shl i64 [[X:%.*]], 4
1951+ ; CHECK-NEXT: [[SHLY:%.*]] = shl i64 [[Y:%.*]], 4
1952+ ; CHECK-NEXT: [[SHLX_OFFSET:%.*]] = add nuw i64 [[SHLX]], 16
1953+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[SHLX_OFFSET]], [[SHLY]]
1954+ ; CHECK-NEXT: ret i1 [[CMP]]
1955+ ;
1956+ %shlx = shl i64 %x , 4
1957+ %shly = shl i64 %y , 4
1958+ %shlx_offset = add nuw i64 %shlx , 16
1959+ %cmp = icmp ule i64 %shlx_offset , %shly
1960+ ret i1 %cmp
1961+ }
1962+
1963+ ; TODO: Handle non-power-of-2 divisors
1964+ define i1 @icmp_ule_offset_with_common_non_pow2_divisor (i64 %x , i64 %y ) {
1965+ ; CHECK-LABEL: @icmp_ule_offset_with_common_non_pow2_divisor(
1966+ ; CHECK-NEXT: [[MULX:%.*]] = mul nuw i64 [[X:%.*]], 7
1967+ ; CHECK-NEXT: [[MULY:%.*]] = mul nuw i64 [[Y:%.*]], 7
1968+ ; CHECK-NEXT: [[MULX_OFFSET:%.*]] = add nuw i64 [[MULX]], 7
1969+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[MULX_OFFSET]], [[MULY]]
1970+ ; CHECK-NEXT: ret i1 [[CMP]]
1971+ ;
1972+ %mulx = mul nuw i64 %x , 7
1973+ %muly = mul nuw i64 %y , 7
1974+ %mulx_offset = add nuw i64 %mulx , 7
1975+ %cmp = icmp ule i64 %mulx_offset , %muly
1976+ ret i1 %cmp
1977+ }
1978+
1979+ define i1 @neg_icmp_slt_offset_without_common_divisor (i64 %x , i64 %y ) {
1980+ ; CHECK-LABEL: @neg_icmp_slt_offset_without_common_divisor(
1981+ ; CHECK-NEXT: [[SHLX:%.*]] = shl i64 [[X:%.*]], 4
1982+ ; CHECK-NEXT: [[SHLY:%.*]] = shl i64 [[Y:%.*]], 4
1983+ ; CHECK-NEXT: [[SHLX_OFFSET:%.*]] = add nsw i64 [[SHLX]], -32
1984+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[SHLX_OFFSET]], [[SHLY]]
1985+ ; CHECK-NEXT: ret i1 [[CMP]]
1986+ ;
1987+ %shlx = shl i64 %x , 4
1988+ %shly = shl i64 %y , 4
1989+ %shlx_offset = add nsw i64 %shlx , -32
1990+ %cmp = icmp slt i64 %shlx_offset , %shly
1991+ ret i1 %cmp
1992+ }
1993+
1994+ define i1 @neg_icmp_slt_offset_with_wrong_sign (i64 %x , i64 %y ) {
1995+ ; CHECK-LABEL: @neg_icmp_slt_offset_with_wrong_sign(
1996+ ; CHECK-NEXT: [[SHLX:%.*]] = shl i64 [[X:%.*]], 4
1997+ ; CHECK-NEXT: [[SHLY:%.*]] = shl i64 [[Y:%.*]], 4
1998+ ; CHECK-NEXT: [[SHLX_OFFSET:%.*]] = add nsw i64 [[SHLX]], 16
1999+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[SHLX_OFFSET]], [[SHLY]]
2000+ ; CHECK-NEXT: ret i1 [[CMP]]
2001+ ;
2002+ %shlx = shl i64 %x , 4
2003+ %shly = shl i64 %y , 4
2004+ %shlx_offset = add nsw i64 %shlx , 16
2005+ %cmp = icmp slt i64 %shlx_offset , %shly
2006+ ret i1 %cmp
2007+ }
2008+
19032009define i1 @icmp_add20_sge_add57 (i32 %x , i32 %y ) {
19042010; CHECK-LABEL: @icmp_add20_sge_add57(
19052011; CHECK-NEXT: [[TMP1:%.*]] = add nsw i32 [[Y:%.*]], 37
0 commit comments