------- Comment #13 from steven at gcc dot gnu dot org 2008-12-01 12:24 ------- After fixing the issue mentioned in comment#2 and comment #8, gcse.c hoisting hoists things too far up, e.g.:
{ pred ENTRY } BB1 if (...) goto BB2 else goto BB3 { succ BB2, BB3 } { pred BB1 } BB2 ... goto BB4 { succ BB4 } { pred BB2 } BB3 ... goto BB4 { succ BB4 } { pred BB2, BB3 } BB4 if (...) goto BB5 else goto BB6 { succ BB5, BB6 } { pred BB4 } BB5 r1 <- exp1 goto BB7 { succ BB7 } { pred BB4 } BB6 r2 <- exp1 goto BB7 { succ BB7 } { pred BB5, BB6 } BB7 ... { succ EXIT } is transformed to: { pred ENTRY } BB1 r3 <- exp1 if (...) goto BB2 else goto BB3 { succ BB2, BB3 } { pred BB1 } BB2 ... goto BB4 { succ BB4 } { pred BB2 } BB3 ... goto BB4 { succ BB4 } { pred BB2, BB3 } BB4 if (...) goto BB5 else goto BB6 { succ BB5, BB6 } { pred BB4 } BB5 r1 <- r3 goto BB7 { succ BB7 } { pred BB4 } BB6 r2 <- r3 goto BB7 { succ BB7 } { pred BB5, BB6 } BB7 ... { succ EXIT } when it would be better to hoist up only to BB4: { pred ENTRY } BB1 if (...) goto BB2 else goto BB3 { succ BB2, BB3 } { pred BB1 } BB2 ... goto BB4 { succ BB4 } { pred BB2 } BB3 ... goto BB4 { succ BB4 } { pred BB2, BB3 } BB4 r3 <- exp1 if (...) goto BB5 else goto BB6 { succ BB5, BB6 } { pred BB4 } BB5 r1 <- r3 goto BB7 { succ BB7 } { pred BB4 } BB6 r2 <- r3 goto BB7 { succ BB7 } { pred BB5, BB6 } BB7 ... { succ EXIT } GCC should not hoist up further than up to the first common dominator. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33828