Index: lib/Transforms/InstCombine/InstructionCombining.cpp =================================================================== --- lib/Transforms/InstCombine/InstructionCombining.cpp +++ lib/Transforms/InstCombine/InstructionCombining.cpp @@ -939,9 +939,14 @@ // `TrueVInPred`. if (InC && !isa(InC) && isa(InC)) InV = InC->isNullValue() ? FalseVInPred : TrueVInPred; - else + else { + // Generate the select in the same block as PN's current incoming block. + // Note: ThisBB need not be the NonConstBB because vector constants + // which are constants by definition are handled here. + Builder->SetInsertPoint(ThisBB->getTerminator()); InV = Builder->CreateSelect(PN->getIncomingValue(i), TrueVInPred, FalseVInPred, "phitmp"); + } NewPN->addIncoming(InV, ThisBB); } } else if (CmpInst *CI = dyn_cast(&I)) { Index: test/Transforms/InstCombine/phi-select-constant.ll =================================================================== --- test/Transforms/InstCombine/phi-select-constant.ll +++ test/Transforms/InstCombine/phi-select-constant.ll @@ -55,3 +55,47 @@ %sel = select <4 x i1> %phinode, <4 x i64> zeroinitializer, <4 x i64> ret <4 x i64> %sel } + +; Test PR33364 +; Insert the generated select into the same block as the incoming phi value. +; The select for loadA (generated through foldOpIntoPhi) should be inserted +; into bb itself. Later passes of instcombine correctly converts this select +; to an insert in the zero'th element of loadA. +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py and modified. +@globalA = global <2 x i8> , align 2 +@globalB = global <2 x i8> zeroinitializer, align 2 +define i8 @vec3(i1 %cond) { +; CHECK-LABEL: vec3 +; CHECK-LABEL: bb: +; CHECK-NEXT: [[LOADA:%.*]] = load <2 x i8>, <2 x i8>* @globalA, +; CHECK-NEXT: [[PHITMP23:%.*]] = insertelement <2 x i8> [[LOADA]], i8 0, i32 0 +; CHECK-NEXT: br i1 %cond, label %bb13_crit_edge, label %bb13 +bb: + %loadA = load <2 x i8>, <2 x i8>* @globalA, align 2 + br i1 %cond, label %bb13_crit_edge, label %bb13 + +; CHECK: bb13_crit_edge: +; CHECK-NEXT: [[LOADB:%.*]] = load <2 x i8>, <2 x i8>* @globalB +; CHECK-NEXT: [[PHITMP:%.*]] = icmp slt <2 x i8> [[LOADB]], +; CHECK-NEXT: [[PHITMP1:%.*]] = select <2 x i1> [[PHITMP]], <2 x i8> [[LOADA]], <2 x i8> zeroinitializer +; CHECK-NEXT: br label %bb13 +bb13_crit_edge: ; preds = %bb15 + %loadB = load <2 x i8>, <2 x i8>* @globalB, align 2 + br label %bb13 + + +; CHECK: bb13: +; CHECK-NEXT: [[PHI:%.*]] = phi <2 x i8> [ [[PHITMP1]], [[BB13_CRIT_EDGE]] ], [ [[PHITMP23]], [[BB:%.*]] ] +; CHECK-NEXT: [[EX1:%.*]] = extractelement <2 x i8> [[PHI]], i32 0 +; CHECK-NEXT: [[EX2:%.*]] = extractelement <2 x i8> [[PHI]], i32 1 +; CHECK-NEXT: [[SUM:%.*]] = add nsw i8 [[EX1]], [[EX2]] +; CHECK-NEXT: ret i8 [[SUM]] +bb13: ; preds = %bb13_crit_edge, %bb + %phi = phi <2 x i8> [ %loadB, %bb13_crit_edge ], [ , %bb ] + %cmp = icmp slt <2 x i8> %phi, + %sel = select <2 x i1> %cmp, <2 x i8> %loadA, <2 x i8> zeroinitializer + %ex1 = extractelement <2 x i8> %sel, i32 0 + %ex2 = extractelement <2 x i8> %sel, i32 1 + %sum = add nsw i8 %ex1, %ex2 + ret i8 %sum +}