1*1364750dSJames Henderson // XFAIL: * 2*1364750dSJames Henderson // Incorrect location for variable "param", see PR48719. 3*1364750dSJames Henderson 4*1364750dSJames Henderson // REQUIRES: lldb 5*1364750dSJames Henderson // UNSUPPORTED: system-windows 6*1364750dSJames Henderson // RUN: %dexter --fail-lt 1.0 -w --debugger lldb \ 7*1364750dSJames Henderson // RUN: --builder 'clang-c' --cflags "-O3 -glldb" -- %s 8*1364750dSJames Henderson 9*1364750dSJames Henderson // 1. param is escaped by inlineme(¶m) so it is not promoted by 10*1364750dSJames Henderson // SROA/mem2reg. 11*1364750dSJames Henderson // 2. InstCombine's LowerDbgDeclare converts the dbg.declare to a set of 12*1364750dSJames Henderson // dbg.values. 13*1364750dSJames Henderson // 3. inlineme(¶m) is inlined. 14*1364750dSJames Henderson // 4. SROA/mem2reg fully promotes param. It does not insert a dbg.value after the 15*1364750dSJames Henderson // PHI it inserts which merges the values out of entry and if.then in the 16*1364750dSJames Henderson // sucessor block. This behaviour is inconsistent. If the dbg.declare was 17*1364750dSJames Henderson // still around (i.e. if param was promoted in the first round of mem2reg 18*1364750dSJames Henderson // BEFORE LowerDbgDeclare) we would see a dbg.value insered for the PHI. 19*1364750dSJames Henderson // 5. JumpThreading removes the if.then block, changing entry to 20*1364750dSJames Henderson // unconditionally branch to if.end. 21*1364750dSJames Henderson // 6. SimplifyCFG stitches entry and if.end together. 22*1364750dSJames Henderson 23*1364750dSJames Henderson // The debug info is not updated to account for the merged value prior to or 24*1364750dSJames Henderson // during JumpThreading/SimplifyCFG so we end up seeing param=5 for the entire 25*1364750dSJames Henderson // function, when we'd expect to see param=10 when stepping onto fluff(). 26*1364750dSJames Henderson 27*1364750dSJames Henderson __attribute__((always_inline)) inlineme(int * p)28*1364750dSJames Hendersonint inlineme(int* p) { return *p * 2; } 29*1364750dSJames Henderson 30*1364750dSJames Henderson __attribute__((optnone)) fluff()31*1364750dSJames Hendersonvoid fluff() {} 32*1364750dSJames Henderson 33*1364750dSJames Henderson __attribute__((noinline)) fun(int param)34*1364750dSJames Hendersonint fun(int param) { 35*1364750dSJames Henderson if (param) 36*1364750dSJames Henderson param = inlineme(¶m); 37*1364750dSJames Henderson fluff(); // DexLabel('s0') 38*1364750dSJames Henderson return param; 39*1364750dSJames Henderson } 40*1364750dSJames Henderson main()41*1364750dSJames Hendersonint main() { 42*1364750dSJames Henderson return fun(5); 43*1364750dSJames Henderson } 44*1364750dSJames Henderson 45*1364750dSJames Henderson // DexExpectWatchValue('param', 10, on_line=ref('s0')) 46