SimplifyCFG: fix a bug in switch to table conversion
authorManman Ren <manman.ren@gmail.com>
Wed, 23 Jul 2014 23:13:23 +0000 (23:13 +0000)
committerManman Ren <manman.ren@gmail.com>
Wed, 23 Jul 2014 23:13:23 +0000 (23:13 +0000)
commitedc60376edcc86bbfac132306581b10f3948af69
tree4102cabcf104b8a2f87750c46266ab9fe730333a
parent45bcf8a59c5415286efd587e0127f51e546fa772
SimplifyCFG: fix a bug in switch to table conversion

We use gep to access the global array "switch.table", and the table index
should be treated as unsigned. When the highest bit is 1, this commit
zero-extends the index to an integer type with larger size.

For a switch on i2, we used to generate:
%switch.tableidx = sub i2 %0, -2
getelementptr inbounds [4 x i64]* @switch.table, i32 0, i2 %switch.tableidx

It is incorrect when %switch.tableidx is 2 or 3. The fix is to generate
%switch.tableidx = sub i2 %0, -2
%switch.tableidx.zext = zext i2 %switch.tableidx to i3
getelementptr inbounds [4 x i64]* @switch.table, i32 0, i3 %switch.tableidx.zext

rdar://17735071

llvm-svn: 213815
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll [new file with mode: 0644]