[LLVMdev] Switch instruction optimization
Hans Wennborg
hans at chromium.org
Fri Dec 20 15:34:38 PST 2013
On Fri, Dec 20, 2013 at 9:30 AM, Philip Reames
<listmail at philipreames.com> wrote:
> On first glance, this looks like it should be handled by
> ForwardSwitchConditionToPHI in SimplifyCFG. (Note: That's a guess. I'm
> reading the code for the first time.)
Yes, that's the idea.
It looks like ForwardSwitchConditionToPHI has done its thing here,
since %i_arg is coming into the phi node instead of 1 and 2, but then
there's some other code that's supposed to fold away the redundant
basic blocks, and that doesn't seem to have worked.
> I'd suggest filling a bug with all of
> the options you're running with. We really should catch this case.
+1 on getting a bug filed, I'd like this to work.
> Well, really there's two missed optimization cases here. Even without the
> case value forwarding, label_case2 and label_case3 are redundant.
I think it's still just one missed optimization. We'll always end up
with two blocks since we need to range-check the switch expression.
- Hans
> On 12/20/13 6:33 AM, Paweł Bylica wrote:
>
> Hello there,
>
> I have a high level code which would look like that in C++:
>
> enum E { A, B, C };
>
> E int2e(long i) {
> switch(i) {
> case 0: return A;
> case 1: return B;
> case 2: return C;
> default: return A;
> }
> }
>
> It is compiled to this IR with O3 optimization:
>
> define i64 @int2e(i64 %i_arg) #0 {
> entry:
> switch i64 %i_arg, label %label_case1 [
> i64 2, label %label_case3
> i64 1, label %label_case2
> ]
>
> label_case1: ; preds = %entry,
> %label_case3, %label_case2
> %merge = phi i64 [ %i_arg, %label_case2 ], [ %i_arg, %label_case3 ], [ 0,
> %entry ]
> ret i64 %merge
>
> label_case2: ; preds = %entry
> br label %label_case1
>
> label_case3: ; preds = %entry
> br label %label_case1
> }
>
> In the result IR `phi` instruction has 3 branches, but two first of them
> returns the same value. Shouln't it be optimized?
>
> - Paweł
More information about the llvm-dev
mailing list