1*67e74705SXin Li /* Check that the result of a bitfield assignment is properly 2*67e74705SXin Li truncated and does not generate a redundant load. */ 3*67e74705SXin Li 4*67e74705SXin Li /* Check that we get one load for each simple assign and two for the 5*67e74705SXin Li compound assign (load the old value before the add then load again 6*67e74705SXin Li to store back). Also check that our g0 pattern is good. */ 7*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o %t %s 8*67e74705SXin Li // RUN: grep 'load ' %t | count 5 9*67e74705SXin Li // RUN: grep "@g0" %t | count 4 10*67e74705SXin Li 11*67e74705SXin Li // Check that we got the right value. 12*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown -O3 -emit-llvm -o %t %s 13*67e74705SXin Li // RUN: not grep 'load ' %t 14*67e74705SXin Li // RUN: not grep "@g0" %t 15*67e74705SXin Li 16*67e74705SXin Li struct s0 { 17*67e74705SXin Li int f0 : 2; 18*67e74705SXin Li _Bool f1 : 1; 19*67e74705SXin Li unsigned f2 : 2; 20*67e74705SXin Li }; 21*67e74705SXin Li 22*67e74705SXin Li int g0(); 23*67e74705SXin Li f0(void)24*67e74705SXin Livoid f0(void) { 25*67e74705SXin Li struct s0 s; 26*67e74705SXin Li if ((s.f0 = 3) != -1) g0(); 27*67e74705SXin Li } 28*67e74705SXin Li f1(void)29*67e74705SXin Livoid f1(void) { 30*67e74705SXin Li struct s0 s; 31*67e74705SXin Li if ((s.f1 = 3) != 1) g0(); 32*67e74705SXin Li } 33*67e74705SXin Li f2(void)34*67e74705SXin Livoid f2(void) { 35*67e74705SXin Li struct s0 s; 36*67e74705SXin Li if ((s.f2 = 3) != 3) g0(); 37*67e74705SXin Li } 38*67e74705SXin Li f3(void)39*67e74705SXin Livoid f3(void) { 40*67e74705SXin Li struct s0 s; 41*67e74705SXin Li // Just check this one for load counts. 42*67e74705SXin Li s.f0 += 3; 43*67e74705SXin Li } 44*67e74705SXin Li 45