[llvm] r286236 - [JumpThreading] Unfold selects that depend on the same condition

via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 22 19:49:10 PST 2016


Hi Pablo,

Thank you for looking at this. I tried ToT with your two patches again 
today.  They still fail on qemu and on real device.

We don't use lnt.  We cross-compile. The compilation commands generated 
by our infrastructure are

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/LU.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/LU.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/FFT.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/FFT.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/array.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/array.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/Stopwatch.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/Stopwatch.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/Random.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/Random.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/SparseCompRow.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/SparseCompRow.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/MonteCarlo.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/MonteCarlo.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/kernel.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/kernel.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/scimark2.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/scimark2.c

clang-aarch64-x -DNDEBUG 
-I/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C 
-I/local/mnt/workspace/scratch/haicheng/test_2016-11-22_22-28-03.429027/llvm-test-suite/cmakebuild/MultiSource/Benchmarks/SciMark2-C 
-O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -w -Werror=date-time -o 
CMakeFiles/scimark2.dir/SOR.c.o -c 
/local/mnt/workspace/llvm-rtp-build-infra/benchmark-src/llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/SOR.c

clang-aarch64-x -O3 -flto -fuse-ld=gold -mcpu=cortex-a57 -O3 -flto 
-fuse-ld=gold -mcpu=cortex-a57 -static CMakeFiles/scimark2.dir/LU.c.o 
CMakeFiles/scimark2.dir/FFT.c.o CMakeFiles/scimark2.dir/array.c.o 
CMakeFiles/scimark2.dir/Stopwatch.c.o CMakeFiles/scimark2.dir/Random.c.o 
CMakeFiles/scimark2.dir/SparseCompRow.c.o 
CMakeFiles/scimark2.dir/MonteCarlo.c.o 
CMakeFiles/scimark2.dir/kernel.c.o CMakeFiles/scimark2.dir/scimark2.c.o 
CMakeFiles/scimark2.dir/SOR.c.o -o scimark2 -lm

clang-aarch64-x is a wrapper of following flags

clang  --target=aarch64-linux-gnu 
--sysroot=/local/mnt/workspace/llvm-rtp-build-infra/sysroots/gcc-fsf-aarch64-linux-gnu-6.1.0/aarch64-linux-gnu/libc 
-isystem 
/local/mnt/workspace/llvm-rtp-build-infra/sysroots/gcc-fsf-aarch64-linux-gnu-6.1.0/aarch64-linux-gnu/include/c++/6.1.0 
-isystem 
/local/mnt/workspace/llvm-rtp-build-infra/sysroots/gcc-fsf-aarch64-linux-gnu-6.1.0/aarch64-linux-gnu/include/c++/6.1.0/aarch64-linux-gnu 
-isystem 
/local/mnt/workspace/llvm-rtp-build-infra/sysroots/gcc-fsf-aarch64-linux-gnu-6.1.0/aarch64-linux-gnu/include/c++/6.1.0/backward 
--gcc-toolchain=/local/mnt/workspace/llvm-rtp-build-infra/sysroots/gcc-fsf-aarch64-linux-gnu-6.1.0

Best,

Haicheng

On 2016-11-22 08:48, Pablo Barrio wrote:
> Hello Haicheng,
> 
> I have been trying to reproduce the issue but it is working fine for
> me. I have run the LLVM test suite with the following command:
> 
> lnt runtest nt --no-timestamp --sandbox venv-llvm-tools --test-suite
> llvm-test-suite --cc /work/llvm-patched/bin/clang --cxx
> /work/llvm-patched/bin/clang++ --cflag -mcpu=cortex-a57 --cflag -O3
> --cflag -flto --cflag -fuse-ld=gold --threads=8 --build-threads=8
> --verbose
> 
> llvm-patched is a compiler built from top-of-tree with my two patches
> on top. I am compiling and running natively on a Cortex-A57.
> 
> Could you share the exact commands that you use for reproducing the
> issue? Do you run SciMark2 through lnt or do you invoke the benchmark
> directly? Are you cross-compiling? Any extra information you can give
> may be of help.
> 
> Many thanks,
> 
> Pablo
> 
> -------------------------
> 
> FROM: Haicheng Wu <haicheng at codeaurora.org>
> SENT: 15 November 2016 21:01
> TO: Pablo Barrio; mcrosier at codeaurora.org
> CC: llvm-commits at lists.llvm.org
> SUBJECT: RE: [llvm] r286236 - [JumpThreading] Unfold selects that
> depend on the same condition
> 
>  Hi Pablo,
> 
>  Thank you for doing this.
> 
>  I also take another look at your patch.  I think you may only need to
> unfold selects belonging to the same basic block.  If they are in two
> different blocks, my understanding is that current jumpthreading
> implementation does not have the capability of optimizing the unfolded
> blocks without something like https://reviews.llvm.org/D22779.
> 
>  Best,
> 
>  Haicheng Wu
> 
>  Employee of Qualcomm Datacenter Technologies, Inc.
> 
>  Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm
> Technologies, Inc.  Qualcomm Technologies, Inc. is a member of the
> Code Aurora Forum, a Linux Foundation Collaborative Project.
> 
>  FROM: Pablo Barrio [mailto:Pablo.Barrio at arm.com]
> SENT: Tuesday, November 15, 2016 10:15 AM
> TO: mcrosier at codeaurora.org
> CC: haicheng at codeaurora.org; llvm-commits at lists.llvm.org
> SUBJECT: Re: [llvm] r286236 - [JumpThreading] Unfold selects that
> depend on the same condition
> 
> Sure, I'll revert now.
> 
> -------------------------
> 
>  FROM: mcrosier at codeaurora.org <mcrosier at codeaurora.org>
> SENT: 15 November 2016 14:18:20
> TO: Pablo Barrio
> CC: haicheng at codeaurora.org; llvm-commits at lists.llvm.org
> SUBJECT: Re: [llvm] r286236 - [JumpThreading] Unfold selects that
> depend on the same condition
> 
>  Hi Pablo,
> Thanks for taking a look at this.  If you don't think you'll have a
> fix
> in the very near future would you mind reverting your commit while you
> 
> investigate?
> 
>   Chad
> 
> On 2016-11-15 05:44, Pablo Barrio via llvm-commits wrote:
>> Thank you Hai, I will have a look at it now.
>> 
>> Pablo
>> 
>> -------------------------
>> 
>> FROM: haicheng at codeaurora.org <haicheng at codeaurora.org>
>> SENT: 15 November 2016 03:24:37
>> TO: Pablo Barrio
>> CC: llvm-commits at lists.llvm.org
>> SUBJECT: RE: [llvm] r286236 - [JumpThreading] Unfold selects that
>> depend on the same condition
>> 
>> Hi Pablo,
>> 
>> It seems that your jumpthreading patch r286236 miscompiles
>> llvm-test-suite/MultiSource/Benchmarks/SciMark2-C/scimark2 when
> using
>> O3+LTO
>> and running on AArch64.
>> 
>> Here is the flag I used to compile " -O3 -flto -fuse-ld=gold
>> -mcpu=cortex-a57"
>> I used normal input size and got seg fault. Small input size seems
>> okay.
>> 
>> Please let me know if you need more information.
>> 
>> Haicheng Wu
>> Employee of Qualcomm Datacenter Technologies, Inc.
>> Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm
>> Technologies, Inc.  Qualcomm Technologies, Inc. is a member of the
>> Code
>> Aurora Forum, a Linux Foundation Collaborative Project.
>> 
>> -----Original Message-----
>>  From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
>> Behalf Of
>> Pablo Barrio via llvm-commits
>> Sent: Tuesday, November 08, 2016 9:54 AM
>> To: llvm-commits at lists.llvm.org
>> Subject: [llvm] r286236 - [JumpThreading] Unfold selects that depend
>> on
>> the
>> same condition
>> 
>> Author: pabbar01
>> Date: Tue Nov  8 08:53:30 2016
>> New Revision: 286236
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=286236&view=rev [1]
>> Log:
>> [JumpThreading] Unfold selects that depend on the same condition
>> 
>> Summary:
>> These are good candidates for jump threading. This enables later
> opts
>> (such
>> as InstCombine) to combine instructions from the selects with
>> instructions
>> out of the selects. SimplifyCFG will fold the select again if
>> unfolding
>> wasn't worth it.
>> 
>> Patch by James Molloy and Pablo Barrio.
>> 
>> Reviewers: rengolin, haicheng, sebpop
>> 
>> Subscribers: jojo, jmolloy, llvm-commits
>> 
>> Differential Revision: https://reviews.llvm.org/D26391 [2]
>> 
>> Added:
>> 
>> llvm/trunk/test/Transforms/JumpThreading/unfold-selects-same-cond.ll
>> Modified:
>>      llvm/trunk/include/llvm/Transforms/Scalar/JumpThreading.h
>>      llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
>> 
>> Modified: llvm/trunk/include/llvm/Transforms/Scalar/JumpThreading.h
>> URL:
>> 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/JumpThreading.h?rev=286236&r1=286235&r2=286236&view=diff
> [3]
>> 
> ==============================================================================
>> --- llvm/trunk/include/llvm/Transforms/Scalar/JumpThreading.h
>> (original)
>> +++ llvm/trunk/include/llvm/Transforms/Scalar/JumpThreading.h Tue
> Nov
>> 8
>> +++ 08:53:30 2016
>> @@ -129,6 +129,8 @@ private:
>>                                       BasicBlock *NewBB, BasicBlock
>> *SuccBB);
>>     /// Check if the block has profile metadata for its outgoing
>> edges.
>>     bool doesBlockHaveProfileData(BasicBlock *BB);
>> +  SelectInst *getSelectFedByPhi(PHINode *PN);  void
>> + expandSelect(SelectInst *SI);
>>   };
>> 
>>   } // end namespace llvm
>> 
>> Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
>> URL:
>> 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=286236&r1=286235&r2=286236&view=diff
> [4]
>> 
> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Tue Nov  8
>> +++ 08:53:30 2016
>> @@ -1963,61 +1963,100 @@ bool JumpThreadingPass::TryToUnfoldSelec
>>     return false;
>>   }
>> 
>> -/// TryToUnfoldSelectInCurrBB - Look for PHI/Select in the same BB
> of
>> 
>> the
>> form
>> +/// GetSelectFedByPhi - Look for PHI/Select in the same BB of the
>> form
>>   /// bb:
>>   ///   %p = phi [false, %bb1], [true, %bb2], [false, %bb3], [true,
>> %bb4],
>> ...
>>   ///   %s = select p, trueval, falseval
>>   ///
>> -/// And expand the select into a branch structure. This later
> enables
>> +/// And return the select. Unfolding it into a branch structure
> later
>> +enables
>>   /// jump-threading over bb in this pass.
>>   ///
>> -/// Using the similar approach of
> SimplifyCFG::FoldCondBranchOnPHI(),
>> unfold -/// select if the associated PHI has at least one constant.
>> If
>> the
>> unfolded -/// select is not jump-threaded, it will be folded again
> in
>> the
>> later -/// optimizations.
>> +/// Using the similar approach of
> SimplifyCFG::FoldCondBranchOnPHI(),
>> +return /// select if the associated PHI has at least one constant.
>> +SelectInst *JumpThreadingPass::getSelectFedByPhi(PHINode *PN) {
>> +
>> +  unsigned NumPHIValues = PN->getNumIncomingValues();  if
>> (NumPHIValues
>> + == 0 || !PN->hasOneUse())
>> +    return nullptr;
>> +
>> +  SelectInst *SI = dyn_cast<SelectInst>(PN->user_back());
>> +  BasicBlock *BB = PN->getParent();
>> +  if (!SI || SI->getParent() != BB)
>> +    return nullptr;
>> +
>> +  Value *Cond = SI->getCondition();
>> +  if (!Cond || Cond != PN || !Cond->getType()->isIntegerTy(1))
>> +    return nullptr;
>> +
>> +  for (unsigned i = 0; i != NumPHIValues; ++i) {
>> +    if (PN->getIncomingBlock(i) == BB)
>> +      return nullptr;
>> +    if (isa<ConstantInt>(PN->getIncomingValue(i)))
>> +      return SI;
>> +  }
>> +
>> +  return nullptr;
>> +}
>> +
>> +/// ExpandSelect - Expand a select into an if-then-else construct.
>> +void JumpThreadingPass::expandSelect(SelectInst *SI) {
>> +
>> +  BasicBlock *BB = SI->getParent();
>> +  TerminatorInst *Term =
>> +      SplitBlockAndInsertIfThen(SI->getCondition(), SI, false);
>> +  PHINode *NewPN = PHINode::Create(SI->getType(), 2, "", SI);
>> +  NewPN->addIncoming(SI->getTrueValue(), Term->getParent());
>> +  NewPN->addIncoming(SI->getFalseValue(), BB);
>> +  SI->replaceAllUsesWith(NewPN);
>> +  SI->eraseFromParent();
>> +}
>> +
>> +/// TryToUnfoldSelectInCurrBB - Unfold selects that could be
>> +jump-threaded were /// they if-then-elses. If the unfolded selects
>> are
>> +not jump-threaded, it will /// be folded again in the later
>> optimizations.
>>   bool JumpThreadingPass::TryToUnfoldSelectInCurrBB(BasicBlock *BB)
> {
>> +
>>     // If threading this would thread across a loop header, don't
>> thread
>> the
>> edge.
>>     // See the comments above FindLoopHeaders for justifications and
>> caveats.
>>     if (LoopHeaders.count(BB))
>>       return false;
>> 
>> -  // Look for a Phi/Select pair in the same basic block.  The Phi
>> feeds
>> the
>> -  // condition of the Select and at least one of the incoming
> values
>> is
>> a
>> -  // constant.
>> -  for (BasicBlock::iterator BI = BB->begin();
>> -       PHINode *PN = dyn_cast<PHINode>(BI); ++BI) {
>> -    unsigned NumPHIValues = PN->getNumIncomingValues();
>> -    if (NumPHIValues == 0 || !PN->hasOneUse())
>> -      continue;
>> +  bool Changed = false;
>> +  for (auto &I : *BB) {
>> 
>> -    SelectInst *SI = dyn_cast<SelectInst>(PN->user_back());
>> -    if (!SI || SI->getParent() != BB)
>> +    // Look for a Phi/Select pair in the same basic block.  The Phi
>> feeds
>> the
>> +    // condition of the Select and at least one of the incoming
>> values
>> is a
>> +    // constant.
>> +    PHINode *PN;
>> +    SelectInst *SI;
>> +    if ((PN = dyn_cast<PHINode>(&I)) && (SI =
> getSelectFedByPhi(PN)))
>> {
>> +      expandSelect(SI);
>> +      Changed = true;
>>         continue;
>> +    }
>> 
>> -    Value *Cond = SI->getCondition();
>> -    if (!Cond || Cond != PN || !Cond->getType()->isIntegerTy(1))
>> -      continue;
>> +    if (I.getType()->isIntegerTy(1)) {
>> 
>> -    bool HasConst = false;
>> -    for (unsigned i = 0; i != NumPHIValues; ++i) {
>> -      if (PN->getIncomingBlock(i) == BB)
>> -        return false;
>> -      if (isa<ConstantInt>(PN->getIncomingValue(i)))
>> -        HasConst = true;
>> -    }
>> +      SmallVector<SelectInst *, 4> Selects;
>> 
>> -    if (HasConst) {
>> -      // Expand the select.
>> -      TerminatorInst *Term =
>> -          SplitBlockAndInsertIfThen(SI->getCondition(), SI, false);
>> -      PHINode *NewPN = PHINode::Create(SI->getType(), 2, "", SI);
>> -      NewPN->addIncoming(SI->getTrueValue(), Term->getParent());
>> -      NewPN->addIncoming(SI->getFalseValue(), BB);
>> -      SI->replaceAllUsesWith(NewPN);
>> -      SI->eraseFromParent();
>> -      return true;
>> +      // Look for scalar booleans used in selects as conditions. If
>> there
>> are
>> +      // several selects that use the same boolean, they are
>> candidates
>> for
>> jump
>> +      // threading and therefore we should unfold them.
>> +      for (Value *U : I.users())
>> +        if (auto *SI = dyn_cast<SelectInst>(U))
>> +          Selects.push_back(SI);
>> +      if (Selects.size() <= 1)
>> +        continue;
>> +
>> +      // Remove duplicates
>> +      std::sort(Selects.begin(), Selects.end());
>> +      auto NewEnd = std::unique(Selects.begin(), Selects.end());
>> +
>> +      Changed = true;
>> +      for (auto SI = Selects.begin(); SI != NewEnd; ++SI)
>> +        expandSelect(*SI);
>>       }
>>     }
>> -
>> -  return false;
>> +
>> +  return Changed;
>>   }
>> 
>> Added:
>> llvm/trunk/test/Transforms/JumpThreading/unfold-selects-same-cond.ll
>> URL:
>> 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/unfold-selects-same-cond.ll?rev=286236&view=auto
> [5]
>> 
> ==============================================================================
>> ---
>> llvm/trunk/test/Transforms/JumpThreading/unfold-selects-same-cond.ll
>> (added)
>> +++
>> llvm/trunk/test/Transforms/JumpThreading/unfold-selects-same-cond.ll
>> +++ Tue Nov  8 08:53:30 2016
>> @@ -0,0 +1,45 @@
>> +; RUN: opt < %s -jump-threading -instcombine -simplifycfg  -S |
>> +FileCheck %s
>> +
>> +; The three selects are jump-threaded so that instcombine can
>> optimize,
>> +and ; simplifycfg should turn the result into a single select.
>> +define i32 @f(i32 %a, i32 %b) {
>> +; CHECK: select
>> +; CHECK-NOT: select
>> +entry:
>> +  %0 = and i32 %a, 1
>> +  %1 = and i32 %b, 1
>> +  %xor = xor i32 %1, %a
>> +  %shr32 = lshr i32 %a, 1
>> +  %cmp10 = icmp eq i32 %xor, 1
>> +  %2 = xor i32 %b, 12345
>> +  %b.addr.1 = select i1 %cmp10, i32 %2, i32 %b
>> +  %shr1633 = lshr i32 %b.addr.1, 1
>> +  %3 = or i32 %shr1633, 54321
>> +  %b.addr.2 = select i1 %cmp10, i32 %3, i32 %shr1633
>> +  %shr1634 = lshr i32 %b.addr.2, 2
>> +  %4 = or i32 %shr1634, 54320
>> +  %b.addr.3 = select i1 %cmp10, i32 %4, i32 %shr1634
>> +  ret i32 %b.addr.3
>> +}
>> +
>> +; Case where the condition is not only used as condition but also
> as
>> +the ; true or false value in at least one of the selects.
>> +define i1 @g(i32 %a, i32 %b) {
>> +; CHECK: select
>> +; CHECK-NOT: select
>> +entry:
>> +  %0 = and i32 %a, 1
>> +  %1 = and i32 %b, 1
>> +  %xor = xor i32 %1, %a
>> +  %shr32 = lshr i32 %a, 1
>> +  %cmp10 = icmp eq i32 %xor, 1
>> +  %2 = xor i32 %b, 12345
>> +  %b.addr.1 = select i1 %cmp10, i32 %2, i32 %b
>> +  %shr1633 = lshr i32 %b.addr.1, 1
>> +  %3 = or i32 %shr1633, 54321
>> +  %b.addr.2 = select i1 %cmp10, i32 %3, i32 %shr1633
>> +  %shr1634 = lshr i32 %b.addr.2, 2
>> +  %4 = icmp eq i32 %shr1634, 54320
>> +  %b.addr.3 = select i1 %cmp10, i1 %4, i1 %cmp10
>> +  ret i1 %b.addr.3
>> +}
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits [6]
>>  IMPORTANT NOTICE: The contents of this email and any attachments
> are
>> confidential and may also be privileged. If you are not the intended
>> recipient, please notify the sender immediately and do not disclose
>> the contents to any other person, use it for any purpose, or store
> or
>> copy the information in any medium. Thank you.
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits [6]
> 
>  IMPORTANT NOTICE: The contents of this email and any attachments are
> confidential and may also be privileged. If you are not the intended
> recipient, please notify the sender immediately and do not disclose
> the contents to any other person, use it for any purpose, or store or
> copy the information in any medium. Thank you.
> 
> Links:
> ------
> [1] http://llvm.org/viewvc/llvm-project?rev=286236&view=rev
> [2] https://reviews.llvm.org/D26391
> [3]
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/JumpThreading.h?rev=286236&r1=286235&r2=286236&view=diff
> [4]
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=286236&r1=286235&r2=286236&view=diff
> [5]
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/unfold-selects-same-cond.ll?rev=286236&view=auto
> [6] http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list