https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79191
--- Comment #3 from Eric Gallager <egallager at gcc dot gnu.org> --- (In reply to Eric Gallager from comment #2) > When I add an explicit "-m64" to the compile command I get the same results > as you, though. Also, it'd be nice if there were a warning from -Wconversion > for the assignment from m to n in h. Or a warning from -Wimplicit-int for > uses of bare "unsigned" without the "int" in general (I've actually been > meaning to file a separate bug for that, but haven't gotten around to it > yet). > Actually looking back on the output there is actually a warning from -Wconversion when I use -m64 so never mind about that part: $ /usr/local/bin/gcc -c -O2 -S -Wall -fdump-tree-optimized=/dev/stdout -Wextra -pedantic -Wconversion -m64 79191.c 79191.c: In function ‘h’: 79191.c:15:15: warning: conversion from ‘long unsigned int’ to ‘unsigned int’ may change value [-Wconversion] unsigned n = m; ^ ;; Function f (f, funcdef_no=0, decl_uid=1832, cgraph_uid=0, symbol_order=0) f (long unsigned int n) { <bb 2> [100.00%] [count: INV]: if (n_1(D) > 3) goto <bb 3>; [0.04%] [count: 0] else goto <bb 4>; [99.96%] [count: INV] <bb 3> [0.04%] [count: 0]: __builtin_abort (); <bb 4> [99.96%] [count: INV]: return; } ;; Function g (g, funcdef_no=1, decl_uid=1835, cgraph_uid=1, symbol_order=1) g (unsigned int n) { <bb 2> [100.00%] [count: INV]: return; } ;; Function h (h, funcdef_no=2, decl_uid=1838, cgraph_uid=2, symbol_order=2) Removing basic block 6 Removing basic block 7 h (long unsigned int m) { unsigned int n; long unsigned int _5; <bb 2> [100.00%] [count: INV]: n_2 = (unsigned int) m_1(D); if (n_2 <= 2) goto <bb 3>; [50.00%] [count: INV] else goto <bb 5>; [50.00%] [count: INV] <bb 3> [50.00%] [count: INV]: _5 = m_1(D) & 4294967292; if (_5 != 0) goto <bb 4>; [0.04%] [count: 0] else goto <bb 5>; [99.96%] [count: INV] <bb 4> [0.02%] [count: 0]: __builtin_abort (); <bb 5> [99.98%] [count: INV]: return; } $