From Anton: switch lowering is still broken somehow. Consider the folowing code: define i32 @main(i32 %argc, i8** %argv) { old_entry1: br label %cond_next cond_next: %not.tmp14 = icmp slt i32 %argc, 11 %hvar2 = zext i1 %not.tmp14 to i32 switch i32 %hvar2, label %old_entry [ i32 -2, label %cond_true i32 -1, label %cond_next i32 0, label %cond_true15 i32 1, label %cond_next22 ] cond_true15: ret i32 1 cond_true: ret i32 2 cond_next22: ret i32 3 old_entry: ret i32 4 } (Yes, I know, that cases -1 and -2 are really dead). Resulting binary will always produce result code 4. Commenting out "-1" and "-2" cases will fix the problem.
Testcase here: CodeGen/Generic/2007-02-23-DAGCombine-Miscompile.ll Patch here: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20070219/044972.html Thanks for tracking this down Anton! -Chris