@@ -451,3 +451,35 @@ define i32 @load_select_with_null_gep(i1 %cond, ptr %p, i64 %off) {
451451 %res = load i32 , ptr %gep , align 4
452452 ret i32 %res
453453}
454+
455+ define i16 @load_select_with_null_gep2 (i1 %cond , ptr %p , i64 %x ) {
456+ ; CHECK-LABEL: @load_select_with_null_gep2(
457+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
458+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 -2
459+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[INVARIANT_GEP]], i64 [[X:%.*]]
460+ ; CHECK-NEXT: [[RES:%.*]] = load i16, ptr [[GEP]], align 2
461+ ; CHECK-NEXT: ret i16 [[RES]]
462+ ;
463+ %sel = select i1 %cond , ptr %p , ptr null
464+ %invariant.gep = getelementptr i8 , ptr %sel , i64 -2
465+ %gep = getelementptr i16 , ptr %invariant.gep , i64 %x
466+ %res = load i16 , ptr %gep , align 2
467+ ret i16 %res
468+ }
469+
470+ define i16 @load_select_with_null_ge3 (i1 %cond , ptr %p , i64 %x , i64 %y ) {
471+ ; CHECK-LABEL: @load_select_with_null_ge3(
472+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
473+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 -2
474+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[INVARIANT_GEP]], i64 [[X:%.*]]
475+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i16, ptr [[GEP]], i64 [[Y:%.*]]
476+ ; CHECK-NEXT: [[RES:%.*]] = load i16, ptr [[GEP2]], align 2
477+ ; CHECK-NEXT: ret i16 [[RES]]
478+ ;
479+ %sel = select i1 %cond , ptr %p , ptr null
480+ %invariant.gep = getelementptr i8 , ptr %sel , i64 -2
481+ %gep = getelementptr i16 , ptr %invariant.gep , i64 %x
482+ %gep2 = getelementptr i16 , ptr %gep , i64 %y
483+ %res = load i16 , ptr %gep2 , align 2
484+ ret i16 %res
485+ }
0 commit comments