From 854a84c0b0a3386943bdc6bf67d8f2e36c4496db Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Fri, 12 Feb 2016 00:09:18 +0000 Subject: [LVI] Improve select handling to use condition This patches teaches LVI to recognize clamp idioms (e.g. select(a > 5, a, 5) will always produce something greater than 5. The tests end up being somewhat simplistic because trying to exercise the case I actually care about (a loop with a range check on a clamped secondary induction variable) ends up tripping across a couple of other imprecisions in the analysis. Ah, the joys of LVI... Differential Revision: http://reviews.llvm.org/D16827 llvm-svn: 260627 --- .../CorrelatedValuePropagation/select.ll | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'llvm/test') diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/select.ll b/llvm/test/Transforms/CorrelatedValuePropagation/select.ll index cab88766113..d237521f301 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/select.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/select.ll @@ -167,3 +167,52 @@ exit: ; CHECK: ret i1 true ret i1 true } + +;; Using the condition to clamp the result +;; + +define i1 @test5(i32* %p, i1 %unknown) { +; CHECK-LABEL: @test5 + %pval = load i32, i32* %p + %cmp1 = icmp slt i32 %pval, 255 + br i1 %cmp1, label %next, label %exit + +next: + %cond = icmp sgt i32 %pval, 0 + %min = select i1 %cond, i32 %pval, i32 5 + ;; TODO: This pointless branch shouldn't be neccessary + br label %next2 +next2: +; CHECK-LABEL: next2: +; CHECK: ret i1 false + %res = icmp eq i32 %min, -1 + ret i1 %res + +exit: +; CHECK-LABEL: exit: +; CHECK: ret i1 true + ret i1 true +} + +define i1 @test6(i32* %p, i1 %unknown) { +; CHECK-LABEL: @test6 + %pval = load i32, i32* %p + %cmp1 = icmp ult i32 %pval, 255 + br i1 %cmp1, label %next, label %exit + +next: + %cond = icmp ne i32 %pval, 254 + %sel = select i1 %cond, i32 %pval, i32 1 + ;; TODO: This pointless branch shouldn't be neccessary + br label %next2 +next2: +; CHECK-LABEL: next2: +; CHECK: ret i1 true + %res = icmp slt i32 %sel, 254 + ret i1 %res + +exit: +; CHECK-LABEL: exit: +; CHECK: ret i1 true + ret i1 true +} -- cgit v1.2.3