From 6f97103b561cb14e26aafa3b90ecec97f1d08944 Mon Sep 17 00:00:00 2001 From: Juneyoung Lee Date: Thu, 30 Jul 2020 23:46:26 +0900 Subject: [PATCH] [JumpThreading] Don't limit the type of an operand Compared to the optimized code with branch conditions never frozen, limiting the type of freeze's operand causes generation of suboptimal code in some cases. I would like to suggest removing the constraint, as this patch does. If the number of freeze instructions becomes significant, this can be revisited. Differential Revision: https://reviews.llvm.org/D84949 --- llvm/lib/Transforms/Scalar/JumpThreading.cpp | 4 ---- llvm/test/Transforms/JumpThreading/freeze.ll | 16 +++++----------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index 2a5bbff..f42d484 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -693,12 +693,8 @@ bool JumpThreadingPass::ComputeValueKnownInPredecessorsImpl( return true; } - // Handle Freeze instructions, in a manner similar to Cast. if (FreezeInst *FI = dyn_cast(I)) { Value *Source = FI->getOperand(0); - if (!isa(Source) && !isa(Source) && - !isa(Source)) - return false; ComputeValueKnownInPredecessorsImpl(Source, BB, Result, Preference, RecursionSet, CxtI); diff --git a/llvm/test/Transforms/JumpThreading/freeze.ll b/llvm/test/Transforms/JumpThreading/freeze.ll index 99df46f..99fa058 100644 --- a/llvm/test/Transforms/JumpThreading/freeze.ll +++ b/llvm/test/Transforms/JumpThreading/freeze.ll @@ -85,20 +85,14 @@ F2: define i32 @test1_cast2(i1 %cond) { ; CHECK-LABEL: @test1_cast2( -; CHECK-NEXT: br i1 [[COND:%.*]], label [[MERGE_THREAD:%.*]], label [[MERGE:%.*]] -; CHECK: Merge.thread: -; CHECK-NEXT: [[V1:%.*]] = call i32 @f1() -; CHECK-NEXT: br label [[T2:%.*]] -; CHECK: Merge: -; CHECK-NEXT: [[V2:%.*]] = call i32 @f2() -; CHECK-NEXT: [[A0_FR:%.*]] = freeze i32 0 -; CHECK-NEXT: [[A_FR:%.*]] = trunc i32 [[A0_FR]] to i1 -; CHECK-NEXT: br i1 [[A_FR]], label [[T2]], label [[F2:%.*]] +; CHECK-NEXT: br i1 [[COND:%.*]], label [[T2:%.*]], label [[F2:%.*]] ; CHECK: T2: -; CHECK-NEXT: [[B5:%.*]] = phi i32 [ [[V1]], [[MERGE_THREAD]] ], [ [[V2]], [[MERGE]] ] +; CHECK-NEXT: [[V1:%.*]] = call i32 @f1() ; CHECK-NEXT: call void @f3() -; CHECK-NEXT: ret i32 [[B5]] +; CHECK-NEXT: ret i32 [[V1]] ; CHECK: F2: +; CHECK-NEXT: [[V2:%.*]] = call i32 @f2() +; CHECK-NEXT: [[A0_FR:%.*]] = freeze i32 0 ; CHECK-NEXT: ret i32 [[V2]] ; br i1 %cond, label %T1, label %F1 -- 2.7.4