Hello, Consider this test case:
---------------------- 8< ---------------- int a; __attribute__((__noinline__,__noclone__,__pure__)) int use (int b) { return b * 2 + 4 + a; } int foo (int b, int c, int d) { int res, r = 0; res = use (b); if (c) r = res; return r; } ---------------------- 8< ---------------- I would expect the "res = use(b)" statement to be sinkable, but this doesn't happen. There are strange VOPs on the return statements, even though they return a GIMPLE register, AFAICT: use (int b) { int a.0; int _2; int _3; int _6; <bb 2>: _2 = b_1(D) + 2; _3 = _2 * 2; # VUSE <.MEM_4(D)> a.0_5 = a; _6 = _3 + a.0_5; # VUSE <.MEM_4(D)> return _6; } foo (int b, int c, int d) { int r; <bb 2>: # VUSE <.MEM_2(D)> r_4 = use (b_3(D)); if (c_5(D) != 0) goto <bb 3>; else goto <bb 5>; <bb 5>: goto <bb 4>; <bb 3>: <bb 4>: # r_1 = PHI <0(5), r_4(3)> # VUSE <.MEM_2(D)> return r_1; } Why are those VUSEs there? Ciao! Steven