diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2013-08-07 10:29:38 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2013-08-07 10:29:38 +0000 |
| commit | 6a4976d3e0e95d1efd0cbf447fb3bf026b0de5c0 (patch) | |
| tree | d7948770a5c6bb42035c033f8200468b35ea9d50 /llvm/test/Transforms/JumpThreading | |
| parent | 289b7b696990c1080b05d14079806c14e2a3ceb8 (diff) | |
| download | bcm5719-llvm-6a4976d3e0e95d1efd0cbf447fb3bf026b0de5c0.tar.gz bcm5719-llvm-6a4976d3e0e95d1efd0cbf447fb3bf026b0de5c0.zip | |
JumpThreading: Turn a select instruction into branching if it allows to thread one half of the select.
This is a common pattern coming out of simplifycfg generating gross code.
a: ; preds = %entry
%sel = select i1 %cmp1, double %add, double 0.000000e+00
br label %b
b:
%cond5 = phi double [ %sel, %a ], [ %sub, %entry ]
%cmp6 = fcmp oeq double %cond5, 0.000000e+00
br i1 %cmp6, label %if.then, label %if.end
becomes
a:
br i1 %cmp1, label %b, label %if.then
b:
%cond5 = phi double [ %sub, %entry ], [ %add, %a ]
%cmp6 = fcmp oeq double %cond5, 0.000000e+00
br i1 %cmp6, label %if.then, label %if.end
Skipping block b completely if possible.
llvm-svn: 187880
Diffstat (limited to 'llvm/test/Transforms/JumpThreading')
| -rw-r--r-- | llvm/test/Transforms/JumpThreading/select.ll | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/llvm/test/Transforms/JumpThreading/select.ll b/llvm/test/Transforms/JumpThreading/select.ll index 18f5e23fac4..201e604e0c5 100644 --- a/llvm/test/Transforms/JumpThreading/select.ll +++ b/llvm/test/Transforms/JumpThreading/select.ll @@ -157,3 +157,66 @@ L3: L4: ret void } + +define void @unfold1(double %x, double %y) nounwind { +entry: + %sub = fsub double %x, %y + %cmp = fcmp ogt double %sub, 1.000000e+01 + br i1 %cmp, label %cond.end4, label %cond.false + +cond.false: ; preds = %entry + %add = fadd double %x, %y + %cmp1 = fcmp ogt double %add, 1.000000e+01 + %add. = select i1 %cmp1, double %add, double 0.000000e+00 + br label %cond.end4 + +cond.end4: ; preds = %entry, %cond.false + %cond5 = phi double [ %add., %cond.false ], [ %sub, %entry ] + %cmp6 = fcmp oeq double %cond5, 0.000000e+00 + br i1 %cmp6, label %if.then, label %if.end + +if.then: ; preds = %cond.end4 + call void @foo() + br label %if.end + +if.end: ; preds = %if.then, %cond.end4 + ret void + +; CHECK-LABEL: @unfold1 +; CHECK: br i1 %cmp, label %cond.end4, label %cond.false +; CHECK: br i1 %cmp1, label %cond.end4, label %if.then +; CHECK: br i1 %cmp6, label %if.then, label %if.end +; CHECK: br label %if.end +} + + +define void @unfold2(i32 %x, i32 %y) nounwind { +entry: + %sub = sub nsw i32 %x, %y + %cmp = icmp sgt i32 %sub, 10 + br i1 %cmp, label %cond.end4, label %cond.false + +cond.false: ; preds = %entry + %add = add nsw i32 %x, %y + %cmp1 = icmp sgt i32 %add, 10 + %add. = select i1 %cmp1, i32 0, i32 %add + br label %cond.end4 + +cond.end4: ; preds = %entry, %cond.false + %cond5 = phi i32 [ %add., %cond.false ], [ %sub, %entry ] + %cmp6 = icmp eq i32 %cond5, 0 + br i1 %cmp6, label %if.then, label %if.end + +if.then: ; preds = %cond.end4 + call void @foo() + br label %if.end + +if.end: ; preds = %if.then, %cond.end4 + ret void + +; CHECK-LABEL: @unfold2 +; CHECK: br i1 %cmp, label %if.end, label %cond.false +; CHECK: br i1 %cmp1, label %if.then, label %cond.end4 +; CHECK: br i1 %cmp6, label %if.then, label %if.end +; CHECK: br label %if.end +} |

