On Tue, Jul 18, 2017 at 7:12 PM, Christopher Li <sparse@xxxxxxxxxxx> wrote: > > OK, I have shrink the test program into the following code. > It can still reproduce the dead loop. It is related to simplify > the phi source. So I add a show_entry() in side each of the CSE loop. Here is what I have so far. Commends in <========== Chris ====================== The original test_menu_iteminfo: .L0: <entry-point> phisrc.32 %phi3(ansi) <- $1 br .L1 .L1: phi.32 %r1(ansi) <- %phi3(ansi), %phi4(ansi) cbr %r1(ansi), .L4, .L5 .L4: symaddr.64 %r2 <- stringA cast.64 %r3 <- (64) %r2 br .L5 .L5: cbr %r1(ansi), .L6, .L7 .L6: ptrcast.64 %r6 <- (64) %r3 ptrcast.64 %r8 <- (64) VOID call.64 %r9 <- strcpy, %r6, %r8 br .L7 .L7: br .L2 .L2: seteq.32 %r11 <- %r1(ansi), $0 phisrc.32 %phi4(ansi) <- %r11 cbr %r11, .L3, .L1 .L3: ret ====================== test_menu_iteminfo: .L0: <entry-point> phisrc.32 %phi3(ansi) <- $1 br .L1 .L1: phi.32 %r1(ansi) <- %phi3(ansi), %phi4(ansi) cbr %r1(ansi), .L4, .L5 .L4: ### <======= r2 getsymaddr get simplify away cast.64 %r3 <- (64) stringA br .L5 .L5: cbr %r1(ansi), .L6, .L7 .L6: ptrcast.64 %r6 <- (64) %r3 ptrcast.64 %r8 <- (64) VOID call.64 %r9 <- strcpy, %r6, %r8 br .L7 .L7: br .L2 .L2: seteq.32 %r11 <- %r1(ansi), $0 phisrc.32 %phi4(ansi) <- %r11 cbr %r1(ansi), .L1, .L3 .L3: ret ====================== test_menu_iteminfo: .L0: <entry-point> phisrc.32 %phi3(ansi) <- $1 br .L1 .L1: phi.32 %r1(ansi) <- %phi3(ansi), %phi4(ansi) cbr %r1(ansi), .L4, .L5 .L4: cast.64 %r3 <- (64) stringA br .L5 .L5: cbr %r1(ansi), .L6, .L2 .L6: ptrcast.64 %r6 <- (64) %r3 ptrcast.64 %r8 <- (64) VOID call.64 %r9 <- strcpy, %r6, %r8 br .L2 <=============== L2 merge with L7 .L2: seteq.32 %r11 <- %r1(ansi), $0 phisrc.32 %phi4(ansi) <- %r11 cbr %r1(ansi), .L1, .L3 .L3: ret ====================== test_menu_iteminfo: .L0: <entry-point> br .L4 <========= phisrc3 get optimize away. This seems wrong .L1: phi.32 %r1(ansi) <- VOID, %phi4(ansi) <======= this seems wrong. cbr %r1(ansi), .L4, .L5 .L4: cast.64 %r3 <- (64) stringA br .L5 .L5: cbr %r1(ansi), .L6, .L3 .L6: ptrcast.64 %r6 <- (64) %r3 ptrcast.64 %r8 <- (64) VOID call.64 %r9 <- strcpy, %r6, %r8 br .L2 .L2: seteq.32 %r11 <- %r1(ansi), $0 phisrc.32 %phi4(ansi) <- %r11 cbr %r1(ansi), .L4, .L3 .L3: ret ====================== test_menu_iteminfo: .L0: <entry-point> br .L4 .L4: cast.64 %r3 <- (64) stringA br .L5 .L5: cbr %r11, .L3, .L6 .L6: ptrcast.64 %r6 <- (64) %r3 ptrcast.64 %r8 <- (64) VOID call.64 %r9 <- strcpy, %r6, %r8 br .L2 .L2: setne.32 %r11 <- %r11, $0 <====== this seems very wrong cbr %r11, .L4, .L3 .L3: ret -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html