[llvm] r249431 - This patch builds on top of D13378 to handle constant condition.
Mehdi Amini via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 6 10:19:21 PDT 2015
Author: mehdi_amini
Date: Tue Oct 6 12:19:20 2015
New Revision: 249431
URL: http://llvm.org/viewvc/llvm-project?rev=249431&view=rev
Log:
This patch builds on top of D13378 to handle constant condition.
With this patch, clang -O3 optimizes correctly providing > 1000x speedup on this artificial benchmark):
for (a=0; a<n; a++)
for (b=0; b<n; b++)
for (c=0; c<n; c++)
for (d=0; d<n; d++)
for (e=0; e<n; e++)
for (f=0; f<n; f++)
x++;
>From test-suite/SingleSource/Benchmarks/Shootout/nestedloop.c
Reviewers: sanjoyd
Differential Revision: http://reviews.llvm.org/D13390
From: Mehdi Amini <mehdi.amini at apple.com>
Added:
llvm/trunk/test/Analysis/ScalarEvolution/constant_condition.ll
Modified:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=249431&r1=249430&r2=249431&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Tue Oct 6 12:19:20 2015
@@ -3904,6 +3904,11 @@ const SCEV *ScalarEvolution::createNodeF
Value *Cond,
Value *TrueVal,
Value *FalseVal) {
+ // Handle "constant" branch or select. This can occur for instance when a
+ // loop pass transforms an inner loop and moves on to process the outer loop.
+ if (auto *CI = dyn_cast<ConstantInt>(Cond))
+ return getSCEV(CI->isOne() ? TrueVal : FalseVal);
+
// Try to match some simple smax or umax patterns.
auto *ICI = dyn_cast<ICmpInst>(Cond);
if (!ICI)
Added: llvm/trunk/test/Analysis/ScalarEvolution/constant_condition.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/constant_condition.ll?rev=249431&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/constant_condition.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/constant_condition.ll Tue Oct 6 12:19:20 2015
@@ -0,0 +1,51 @@
+; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
+
+define i32 @branch_true(i32 %x, i32 %y) {
+; CHECK-LABEL: Classifying expressions for: @branch_true
+ entry:
+ br i1 true, label %add, label %merge
+
+ add:
+ %sum = add i32 %x, %y
+ br label %merge
+
+ merge:
+ %v = phi i32 [ %sum, %add ], [ %x, %entry ]
+; CHECK: %v = phi i32 [ %sum, %add ], [ %x, %entry ]
+; CHECK-NEXT: --> (%x + %y) U: full-set S: full-set
+ ret i32 %v
+}
+
+define i32 @branch_false(i32 %x, i32 %y) {
+; CHECK-LABEL: Classifying expressions for: @branch_false
+ entry:
+ br i1 false, label %add, label %merge
+
+ add:
+ %sum = add i32 %x, %y
+ br label %merge
+
+ merge:
+ %v = phi i32 [ %sum, %add ], [ %x, %entry ]
+; CHECK: %v = phi i32 [ %sum, %add ], [ %x, %entry ]
+; CHECK-NEXT: --> %x U: full-set S: full-set
+ ret i32 %v
+}
+
+define i32 @select_true(i32 %x, i32 %y) {
+; CHECK-LABEL: Classifying expressions for: @select_true
+ entry:
+ %v = select i1 true, i32 %x, i32 %y
+; CHECK: %v = select i1 true, i32 %x, i32 %y
+; CHECK-NEXT: --> %x U: full-set S: full-set
+ ret i32 %v
+}
+
+define i32 @select_false(i32 %x, i32 %y) {
+; CHECK-LABEL: Classifying expressions for: @select_false
+ entry:
+ %v = select i1 false, i32 %x, i32 %y
+; CHECK: %v = select i1 false, i32 %x, i32 %y
+; CHECK-NEXT: --> %y U: full-set S: full-set
+ ret i32 %v
+}
More information about the llvm-commits
mailing list