I am performing a transformation that requires changing the targets of a basic block ending with a switch instruction. In particular, I need to delete the edge that goes to the "default" basic block. But, LLVM switch instruction always wants a default target basic block for a switch instruction. It is not clear how to accomplish this, since I don't have a replacement default target block. I could potentially fake that edge to be one of the other case label targets, but that is an ugly hack and I don't want to do that. I would appreciate if you can suggest better alternatives. -Milind
On Jul 17, 2013, at 9:01 PM, Milind Chabbi <Milind.Chabbi at rice.edu> wrote:> I am performing a transformation that requires changing the targets of > a basic block ending with a switch instruction. > In particular, I need to delete the edge that goes to the "default" > basic block. > But, LLVM switch instruction always wants a default target basic block > for a switch instruction. > It is not clear how to accomplish this, since I don't have a > replacement default target block. > I could potentially fake that edge to be one of the other case label > targets, but that is an ugly hack and I don't want to do that. > I would appreciate if you can suggest better alternatives.Hi Milind, If you make the "default" branch to a block that has an UnreachableInst as a terminator, the SimplifyCFG pass will remove one of the switch cases and replace the block that the default branches to with the block that this removed case branches to. This sounds a lot like the "ugly hack" that you would like to avoid. Would it be a reasonable solution for what you are trying to accomplish? Mark
Hi Mark, This will workaround the problem of "default" branch restriction on the switch instruction. The trouble with this technique is that it will trump later optimization phases such as constant propagation. When a block was part of a case, because of the knowledge of the case value, the block was a candidate for better optimization. However, when we move the body of the case into the default, the knowledge of the case value is lost and the body is less optimizable. -Milind On Wed, Jul 17, 2013 at 9:29 PM, Mark Lacey <mark.lacey at apple.com> wrote:> On Jul 17, 2013, at 9:01 PM, Milind Chabbi <Milind.Chabbi at rice.edu> wrote: >> I am performing a transformation that requires changing the targets of >> a basic block ending with a switch instruction. >> In particular, I need to delete the edge that goes to the "default" >> basic block. >> But, LLVM switch instruction always wants a default target basic block >> for a switch instruction. >> It is not clear how to accomplish this, since I don't have a >> replacement default target block. >> I could potentially fake that edge to be one of the other case label >> targets, but that is an ugly hack and I don't want to do that. >> I would appreciate if you can suggest better alternatives. > > Hi Milind, > > If you make the "default" branch to a block that has an UnreachableInst as a terminator, the SimplifyCFG pass will remove one of the switch cases and replace the block that the default branches to with the block that this removed case branches to. This sounds a lot like the "ugly hack" that you would like to avoid. Would it be a reasonable solution for what you are trying to accomplish? > > Mark > >