@@ -984,11 +984,11 @@ define i1 @gep_multiple_multi_use_above_limit(ptr %base, i64 %idx1, i64 %idx2, i
984984
985985define i1 @gep_gep_multiple_eq (ptr %base , i64 %idx1 , i64 %idx2 , i64 %idx3 , i64 %idx4 ) {
986986; CHECK-LABEL: @gep_gep_multiple_eq(
987- ; CHECK-NEXT: [[GEP1 :%.*]] = getelementptr i32, ptr [[BASE :%.*]], i64 [[IDX1 :%.*]]
988- ; CHECK-NEXT: [[GEP2 :%.*]] = getelementptr i32, ptr [[GEP1 ]], i64 [[IDX2 :%.*]]
989- ; CHECK-NEXT: [[GEP3 :%.*]] = getelementptr i32, ptr [[BASE ]], i64 [[IDX3:%.* ]]
990- ; CHECK-NEXT: [[GEP4 :%.*]] = getelementptr i32, ptr [[GEP3 ]], i64 [[IDX4:%.*]]
991- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP2 ]], [[GEP4]]
987+ ; CHECK-NEXT: [[GEP1_IDX1 :%.*]] = add i64 [[IDX1 :%.*]], [[IDX2 :%.*]]
988+ ; CHECK-NEXT: [[GEP3_IDX2 :%.*]] = add i64 [[IDX3:%.* ]], [[IDX4 :%.*]]
989+ ; CHECK-NEXT: [[CMP_UNSHIFTED :%.*]] = xor i64 [[GEP1_IDX1 ]], [[GEP3_IDX2 ]]
990+ ; CHECK-NEXT: [[CMP_MASK :%.*]] = and i64 [[CMP_UNSHIFTED ]], 4611686018427387903
991+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[CMP_MASK ]], 0
992992; CHECK-NEXT: ret i1 [[CMP]]
993993;
994994 %gep1 = getelementptr i32 , ptr %base , i64 %idx1
@@ -1001,11 +1001,9 @@ define i1 @gep_gep_multiple_eq(ptr %base, i64 %idx1, i64 %idx2, i64 %idx3, i64 %
10011001
10021002define i1 @gep_gep_multiple_eq_nuw (ptr %base , i64 %idx1 , i64 %idx2 , i64 %idx3 , i64 %idx4 ) {
10031003; CHECK-LABEL: @gep_gep_multiple_eq_nuw(
1004- ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX1:%.*]]
1005- ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
1006- ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i32, ptr [[BASE]], i64 [[IDX3:%.*]]
1007- ; CHECK-NEXT: [[GEP4:%.*]] = getelementptr nuw i32, ptr [[GEP3]], i64 [[IDX4:%.*]]
1008- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP2]], [[GEP4]]
1004+ ; CHECK-NEXT: [[GEP1_IDX1:%.*]] = add i64 [[IDX1:%.*]], [[IDX2:%.*]]
1005+ ; CHECK-NEXT: [[GEP3_IDX2:%.*]] = add i64 [[IDX3:%.*]], [[IDX4:%.*]]
1006+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[GEP1_IDX1]], [[GEP3_IDX2]]
10091007; CHECK-NEXT: ret i1 [[CMP]]
10101008;
10111009 %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx1
@@ -1018,11 +1016,13 @@ define i1 @gep_gep_multiple_eq_nuw(ptr %base, i64 %idx1, i64 %idx2, i64 %idx3, i
10181016
10191017define i1 @gep_gep_multiple_eq_nuw_different_scales (ptr %base , i64 %idx1 , i64 %idx2 , i64 %idx3 , i64 %idx4 ) {
10201018; CHECK-LABEL: @gep_gep_multiple_eq_nuw_different_scales(
1021- ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX1:%.*]]
1022- ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i64, ptr [[GEP1]], i64 [[IDX2:%.*]]
1023- ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i32, ptr [[BASE]], i64 [[IDX3:%.*]]
1024- ; CHECK-NEXT: [[GEP4:%.*]] = getelementptr nuw i64, ptr [[GEP3]], i64 [[IDX4:%.*]]
1025- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP2]], [[GEP4]]
1019+ ; CHECK-NEXT: [[GEP1_IDX:%.*]] = shl nuw i64 [[IDX1:%.*]], 2
1020+ ; CHECK-NEXT: [[GEP2_IDX:%.*]] = shl nuw i64 [[IDX2:%.*]], 3
1021+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw i64 [[GEP1_IDX]], [[GEP2_IDX]]
1022+ ; CHECK-NEXT: [[GEP3_IDX:%.*]] = shl nuw i64 [[IDX3:%.*]], 2
1023+ ; CHECK-NEXT: [[GEP4_IDX:%.*]] = shl nuw i64 [[IDX4:%.*]], 3
1024+ ; CHECK-NEXT: [[TMP2:%.*]] = add nuw i64 [[GEP3_IDX]], [[GEP4_IDX]]
1025+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[TMP1]], [[TMP2]]
10261026; CHECK-NEXT: ret i1 [[CMP]]
10271027;
10281028 %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx1
@@ -1035,11 +1035,13 @@ define i1 @gep_gep_multiple_eq_nuw_different_scales(ptr %base, i64 %idx1, i64 %i
10351035
10361036define i1 @gep_gep_multiple_eq_partial_nuw_different_scales (ptr %base , i64 %idx1 , i64 %idx2 , i64 %idx3 , i64 %idx4 ) {
10371037; CHECK-LABEL: @gep_gep_multiple_eq_partial_nuw_different_scales(
1038- ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX1:%.*]]
1039- ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i64, ptr [[GEP1]], i64 [[IDX2:%.*]]
1040- ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i32, ptr [[BASE]], i64 [[IDX3:%.*]]
1041- ; CHECK-NEXT: [[GEP4:%.*]] = getelementptr i64, ptr [[GEP3]], i64 [[IDX4:%.*]]
1042- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP2]], [[GEP4]]
1038+ ; CHECK-NEXT: [[GEP1_IDX:%.*]] = shl nuw i64 [[IDX1:%.*]], 2
1039+ ; CHECK-NEXT: [[GEP2_IDX:%.*]] = shl nuw i64 [[IDX2:%.*]], 3
1040+ ; CHECK-NEXT: [[TMP1:%.*]] = add nuw i64 [[GEP1_IDX]], [[GEP2_IDX]]
1041+ ; CHECK-NEXT: [[GEP3_IDX:%.*]] = shl nuw i64 [[IDX3:%.*]], 2
1042+ ; CHECK-NEXT: [[GEP4_IDX:%.*]] = shl i64 [[IDX4:%.*]], 3
1043+ ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[GEP3_IDX]], [[GEP4_IDX]]
1044+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[TMP1]], [[TMP2]]
10431045; CHECK-NEXT: ret i1 [[CMP]]
10441046;
10451047 %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx1
@@ -1052,11 +1054,13 @@ define i1 @gep_gep_multiple_eq_partial_nuw_different_scales(ptr %base, i64 %idx1
10521054
10531055define i1 @gep_gep_multiple_eq_partial_inbounds_different_scales (ptr %base , i64 %idx1 , i64 %idx2 , i64 %idx3 , i64 %idx4 ) {
10541056; CHECK-LABEL: @gep_gep_multiple_eq_partial_inbounds_different_scales(
1055- ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX1:%.*]]
1056- ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i64, ptr [[GEP1]], i64 [[IDX2:%.*]]
1057- ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds i32, ptr [[BASE]], i64 [[IDX3:%.*]]
1058- ; CHECK-NEXT: [[GEP4:%.*]] = getelementptr i64, ptr [[GEP3]], i64 [[IDX4:%.*]]
1059- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP2]], [[GEP4]]
1057+ ; CHECK-NEXT: [[GEP1_IDX:%.*]] = shl nsw i64 [[IDX1:%.*]], 2
1058+ ; CHECK-NEXT: [[GEP2_IDX:%.*]] = shl nsw i64 [[IDX2:%.*]], 3
1059+ ; CHECK-NEXT: [[TMP1:%.*]] = add nsw i64 [[GEP1_IDX]], [[GEP2_IDX]]
1060+ ; CHECK-NEXT: [[GEP3_IDX:%.*]] = shl nsw i64 [[IDX3:%.*]], 2
1061+ ; CHECK-NEXT: [[GEP4_IDX:%.*]] = shl i64 [[IDX4:%.*]], 3
1062+ ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[GEP3_IDX]], [[GEP4_IDX]]
1063+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[TMP1]], [[TMP2]]
10601064; CHECK-NEXT: ret i1 [[CMP]]
10611065;
10621066 %gep1 = getelementptr inbounds i32 , ptr %base , i64 %idx1
@@ -1069,11 +1073,9 @@ define i1 @gep_gep_multiple_eq_partial_inbounds_different_scales(ptr %base, i64
10691073
10701074define i1 @gep_gep_multiple_ult_nuw (ptr %base , i64 %idx1 , i64 %idx2 , i64 %idx3 , i64 %idx4 ) {
10711075; CHECK-LABEL: @gep_gep_multiple_ult_nuw(
1072- ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX1:%.*]]
1073- ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
1074- ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i32, ptr [[BASE]], i64 [[IDX3:%.*]]
1075- ; CHECK-NEXT: [[GEP4:%.*]] = getelementptr nuw i32, ptr [[GEP3]], i64 [[IDX4:%.*]]
1076- ; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[GEP2]], [[GEP4]]
1076+ ; CHECK-NEXT: [[GEP1_IDX1:%.*]] = add i64 [[IDX1:%.*]], [[IDX2:%.*]]
1077+ ; CHECK-NEXT: [[GEP3_IDX2:%.*]] = add i64 [[IDX3:%.*]], [[IDX4:%.*]]
1078+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[GEP1_IDX1]], [[GEP3_IDX2]]
10771079; CHECK-NEXT: ret i1 [[CMP]]
10781080;
10791081 %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx1
@@ -1103,13 +1105,15 @@ define i1 @gep_gep_multiple_ult_missing_nuw(ptr %base, i64 %idx1, i64 %idx2, i64
11031105
11041106define i1 @gep_gep_multiple_ult_nuw_multi_use (ptr %base , i64 %idx1 , i64 %idx2 , i64 %idx3 , i64 %idx4 ) {
11051107; CHECK-LABEL: @gep_gep_multiple_ult_nuw_multi_use(
1106- ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX1:%.*]]
1107- ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
1108- ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i32, ptr [[BASE]], i64 [[IDX3:%.*]]
1109- ; CHECK-NEXT: [[GEP5:%.*]] = getelementptr nuw i32, ptr [[GEP3]], i64 [[IDX4:%.*]]
1110- ; CHECK-NEXT: call void @use(ptr [[GEP2]])
1108+ ; CHECK-NEXT: [[IDX3:%.*]] = add i64 [[IDX1:%.*]], [[IDX2:%.*]]
1109+ ; CHECK-NEXT: [[GEP3_IDX:%.*]] = shl nuw i64 [[IDX3]], 2
1110+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i8, ptr [[BASE:%.*]], i64 [[GEP3_IDX]]
1111+ ; CHECK-NEXT: [[IDX4:%.*]] = add i64 [[IDX5:%.*]], [[IDX6:%.*]]
1112+ ; CHECK-NEXT: [[GEP4_IDX:%.*]] = shl nuw i64 [[IDX4]], 2
1113+ ; CHECK-NEXT: [[GEP5:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 [[GEP4_IDX]]
1114+ ; CHECK-NEXT: call void @use(ptr [[GEP3]])
11111115; CHECK-NEXT: call void @use(ptr [[GEP5]])
1112- ; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[GEP2 ]], [[GEP5 ]]
1116+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[GEP3_IDX ]], [[GEP4_IDX ]]
11131117; CHECK-NEXT: ret i1 [[CMP]]
11141118;
11151119 %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx1
0 commit comments