Index: lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- lib/CodeGen/CodeGenPrepare.cpp +++ lib/CodeGen/CodeGenPrepare.cpp @@ -2911,8 +2911,10 @@ // Build a map between to // value of base register. + // Bail out if there is no common type. FoldAddrToValueMapping Map; - initializeMap(Map); + if (!initializeMap(Map)) + return false; Value *CommonValue = findCommon(Map); if (CommonValue) @@ -2926,7 +2928,8 @@ /// If address is not an instruction than basic block is set to null. /// At the same time we find a common type for different field we will /// use to create new Phi/Select nodes. Keep it in CommonType field. - void initializeMap(FoldAddrToValueMapping &Map) { + /// Return false if there is no common type found. + bool initializeMap(FoldAddrToValueMapping &Map) { // Keep track of keys where the value is null. We will need to replace it // with constant null when we know the common type. SmallVector NullValue; @@ -2938,10 +2941,10 @@ Value *DV = AM.GetFieldAsValue(DifferentField, IntPtrTy); if (DV) { - if (CommonType) - assert(CommonType == DV->getType() && "Different types detected!"); - else - CommonType = DV->getType(); + auto *Type = DV->getType(); + if (CommonType && CommonType != Type) + return false; + CommonType = Type; Map[{ AM.OriginalValue, BB }] = DV; } else { NullValue.push_back({ AM.OriginalValue, BB }); @@ -2950,6 +2953,7 @@ assert(CommonType && "At least one non-null value must be!"); for (auto VIBB : NullValue) Map[VIBB] = Constant::getNullValue(CommonType); + return true; } /// \brief We have mapping between value A and basic block where value A Index: test/Transforms/CodeGenPrepare/X86/sink-addrmode-base.ll =================================================================== --- test/Transforms/CodeGenPrepare/X86/sink-addrmode-base.ll +++ test/Transforms/CodeGenPrepare/X86/sink-addrmode-base.ll @@ -508,3 +508,36 @@ %v = add i32 %v1, %v2 ret i32 %v } + +; Different types but null is the first? +define i32 @test19(i1 %cond1, i1 %cond2, i64* %b2, i8* %b1) { +; CHECK-LABEL: @test19 +entry: + %g1 = getelementptr inbounds i64, i64* %b2, i64 5 + %bc1 = bitcast i64* %g1 to i32* + br i1 %cond1, label %if.then1, label %if.then2 + +if.then1: + %g2 = getelementptr inbounds i8, i8* %b1, i64 40 + %bc2 = bitcast i8* %g2 to i32* + br label %fallthrough + +if.then2: + %bc1_1 = bitcast i64* %g1 to i32* + br i1 %cond2, label %fallthrough, label %if.then3 + +if.then3: + %g3 = getelementptr inbounds i64, i64* null, i64 5 + %bc1_2 = bitcast i64* %g3 to i32* + br label %fallthrough + +fallthrough: +; CHECK-NOT: sunk_phi + %c = phi i32* [%bc2, %if.then1], [%bc1_1, %if.then2], [%bc1_2, %if.then3] + %v1 = load i32, i32* %c, align 4 + %g1_1 = getelementptr inbounds i64, i64* %b2, i64 5 + %bc1_1_1 = bitcast i64* %g1_1 to i32* + %v2 = load i32, i32* %bc1_1_1, align 4 + %v = add i32 %v1, %v2 + ret i32 %v +}