Hi, I'm working on compiler for an architecture with a multiply instruction that takes two 32-bit factors, sign-extends both factors to 64-bits and then does a 64-bit multiplication and stores the result to a destination register. The combine pass successfully generates the pattern (mulhizi3) for this instruction twice for the following function.
long long res0; long long res1; long f1(long a, long b, long c, long d) { res0=((long long) a)*((long long) b); res1=((long long) c)*((long long) d); } The generated RTL from combine looks like: (insn 10 9 11 2 g.c:5 (set (reg:ZI 176) (mult:ZI (sign_extend:ZI (reg:HI 9 r6 [ b ])) (sign_extend:ZI (reg:HI 6 r4 [ a ])))) 262 {*mulhizi3} (nil)) However, if I modify the function so that one of the factors is reused, long f1(long a, long b, long c) { res0=((long long) a)*((long long) b); res1=((long long) c)*((long long) b); } combine will not fuse the reused sign-extension result to generate the mulhizi3 pattern. I am wondering if anyone else has hit this issue or if I have done something wrong in my port. Any help would be greatly appreciated. Thanks, John Lu