diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -1168,6 +1168,11 @@ // we see one, check to see if it's partially redundant. If so, insert a PHI // which can then be used to thread the values. Value *SimplifyValue = CondInst; + + if (auto *FI = dyn_cast(SimplifyValue)) + // Look into freeze's operand + SimplifyValue = FI->getOperand(0); + if (CmpInst *CondCmp = dyn_cast(SimplifyValue)) if (isa(CondCmp->getOperand(1))) SimplifyValue = CondCmp->getOperand(0); diff --git a/llvm/test/Transforms/JumpThreading/pre-load.ll b/llvm/test/Transforms/JumpThreading/pre-load.ll --- a/llvm/test/Transforms/JumpThreading/pre-load.ll +++ b/llvm/test/Transforms/JumpThreading/pre-load.ll @@ -46,19 +46,19 @@ define i32 @pre_freeze(i1 %cond, i32 %n) { ; CHECK-LABEL: @pre_freeze( -; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]] -; CHECK: A: +; CHECK-NEXT: br i1 [[COND:%.*]], label [[C_THREAD:%.*]], label [[C:%.*]] +; CHECK: C.thread: ; CHECK-NEXT: store i32 0, i32* @x, align 4 -; CHECK-NEXT: br label [[C]] +; CHECK-NEXT: br label [[YES:%.*]] ; CHECK: C: -; CHECK-NEXT: [[PTR:%.*]] = phi i32* [ @x, [[A]] ], [ @y, [[TMP0:%.*]] ] -; CHECK-NEXT: [[A:%.*]] = load i32, i32* [[PTR]], align 4 -; CHECK-NEXT: [[COND2:%.*]] = icmp eq i32 [[A]], 0 +; CHECK-NEXT: [[A_PR:%.*]] = load i32, i32* @y, align 4 +; CHECK-NEXT: [[COND2:%.*]] = icmp eq i32 [[A_PR]], 0 ; CHECK-NEXT: [[COND2_FR:%.*]] = freeze i1 [[COND2]] -; CHECK-NEXT: br i1 [[COND2_FR]], label [[YES:%.*]], label [[NO:%.*]] +; CHECK-NEXT: br i1 [[COND2_FR]], label [[YES]], label [[NO:%.*]] ; CHECK: YES: +; CHECK-NEXT: [[A5:%.*]] = phi i32 [ 0, [[C_THREAD]] ], [ [[A_PR]], [[C]] ] ; CHECK-NEXT: call void @f() -; CHECK-NEXT: ret i32 [[A]] +; CHECK-NEXT: ret i32 [[A5]] ; CHECK: NO: ; CHECK-NEXT: call void @g() ; CHECK-NEXT: ret i32 1