Hi! In the *{add,sub}v<dwi>4_doubleword patterns, we don't really want to see a VOIDmode last operand, because it then means invalid RTL (sign_extend:{TI,POI} (const_int ...)) or so, and therefore something we don't really handle in the splitter either. We have *{add,sub}v<dwi>4_doubleword_1 pattern for those and that is what combine will match, the problem in this testcase is just that it was only RA that propagated the constant into the instruction.
In the similar *{add,sub}v<mode>4 patterns, we make sure not to accept VOIDmode operand and similarly to these have _1 suffixed variant that allows constants. Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2020-01-26 Jakub Jelinek <ja...@redhat.com> PR target/93412 * config/i386/i386.md (*addv<dwi>4_doubleword, *subv<dwi>4_doubleword): Use nonimmediate_operand instead of x86_64_hilo_general_operand and drop <di> from constraint of last operand. * gcc.dg/pr93412.c: New test. --- gcc/config/i386/i386.md.jj 2020-01-23 16:16:55.982005551 +0100 +++ gcc/config/i386/i386.md 2020-01-25 19:30:20.358205644 +0100 @@ -6135,7 +6135,7 @@ (define_insn_and_split "*addv<dwi>4_doub (sign_extend:<QPWI> (match_operand:<DWI> 1 "nonimmediate_operand" "%0,0")) (sign_extend:<QPWI> - (match_operand:<DWI> 2 "x86_64_hilo_general_operand" "r<di>,o"))) + (match_operand:<DWI> 2 "nonimmediate_operand" "r,o"))) (sign_extend:<QPWI> (plus:<DWI> (match_dup 1) (match_dup 2))))) (set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r") @@ -6644,7 +6644,7 @@ (define_insn_and_split "*subv<dwi>4_doub (sign_extend:<QPWI> (match_operand:<DWI> 1 "nonimmediate_operand" "0,0")) (sign_extend:<QPWI> - (match_operand:<DWI> 2 "x86_64_hilo_general_operand" "r<di>,o"))) + (match_operand:<DWI> 2 "nonimmediate_operand" "r,o"))) (sign_extend:<QPWI> (minus:<DWI> (match_dup 1) (match_dup 2))))) (set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r") --- gcc/testsuite/gcc.dg/pr93412.c.jj 2020-01-25 19:36:23.083680678 +0100 +++ gcc/testsuite/gcc.dg/pr93412.c 2020-01-25 19:36:09.771883437 +0100 @@ -0,0 +1,15 @@ +/* PR target/93412 */ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-Og" } */ + +unsigned char a; +int b; +unsigned c; + +int +foo (int e, int f, int g, int h, int k, int i, short j) +{ + b = __builtin_add_overflow (a, 0, &c); + b = __builtin_add_overflow_p (b, a, (unsigned __int128) 0) ? b : 0; + return e + f + g + a + h + k + i + j + c; +} Jakub