@@ -100,3 +100,107 @@ void binary_assign_struct() {
100100// OGCG: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[LS_PTR]], ptr align 4 @gs, i64 8, i1 false)
101101// OGCG: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[LSV_PTR]], ptr align 4 @gsv, i64 8, i1 true)
102102// OGCG: ret void
103+
104+ int ignore_result_assign () {
105+ int arr [10 ];
106+ int i , j ;
107+ j = i = 123 , 0 ;
108+ j = arr [i = 5 ];
109+ int * p , * q = 0 ;
110+ if (p = q )
111+ return 1 ;
112+ return 0 ;
113+ }
114+
115+ // CIR-LABEL: cir.func{{.*}} @ignore_result_assign() -> !s32i
116+ // CIR: %[[RETVAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
117+ // CIR: %[[ARR:.*]] = cir.alloca !cir.array<!s32i x 10>, !cir.ptr<!cir.array<!s32i x 10>>, ["arr"]
118+ // CIR: %[[I:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["i"]
119+ // CIR: %[[J:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["j"]
120+ // CIR: %[[P:.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["p"]
121+ // CIR: %[[Q:.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["q", init]
122+ // CIR: %[[VAL_123:.*]] = cir.const #cir.int<123> : !s32i
123+ // CIR: cir.store{{.*}} %[[VAL_123]], %[[I]] : !s32i, !cir.ptr<!s32i>
124+ // CIR: cir.store{{.*}} %[[VAL_123]], %[[J]] : !s32i, !cir.ptr<!s32i>
125+ // CIR: %[[VAL_0:.*]] = cir.const #cir.int<0> : !s32i
126+ // CIR: %[[VAL_5:.*]] = cir.const #cir.int<5> : !s32i
127+ // CIR: cir.store{{.*}} %[[VAL_5]], %[[I]] : !s32i, !cir.ptr<!s32i>
128+ // CIR: %[[ARR_DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARR]] : !cir.ptr<!cir.array<!s32i x 10>> -> !cir.ptr<!s32i>
129+ // CIR: %[[ARR_ELEM:.*]] = cir.ptr_stride %[[ARR_DECAY]], %[[VAL_5]] : (!cir.ptr<!s32i>, !s32i) -> !cir.ptr<!s32i>
130+ // CIR: %[[ARR_LOAD:.*]] = cir.load{{.*}} %[[ARR_ELEM]] : !cir.ptr<!s32i>, !s32i
131+ // CIR: cir.store{{.*}} %[[ARR_LOAD]], %[[J]] : !s32i, !cir.ptr<!s32i>
132+ // CIR: %[[NULL:.*]] = cir.const #cir.ptr<null> : !cir.ptr<!s32i>
133+ // CIR: cir.store{{.*}} %[[NULL]], %[[Q]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
134+ // CIR: cir.scope {
135+ // CIR: %[[Q_VAL:.*]] = cir.load{{.*}} %[[Q]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
136+ // CIR: cir.store{{.*}} %[[Q_VAL]], %[[P]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
137+ // CIR: %[[COND:.*]] = cir.cast ptr_to_bool %[[Q_VAL]] : !cir.ptr<!s32i> -> !cir.bool
138+ // CIR: cir.if %[[COND]] {
139+ // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
140+ // CIR: cir.store %[[ONE]], %[[RETVAL]] : !s32i, !cir.ptr<!s32i>
141+ // CIR: %{{.*}} = cir.load %[[RETVAL]] : !cir.ptr<!s32i>, !s32i
142+ // CIR: cir.return
143+ // CIR: }
144+ // CIR: }
145+ // CIR: %[[ZERO:.*]] = cir.const #cir.int<0> : !s32i
146+ // CIR: cir.store %[[ZERO]], %[[RETVAL]] : !s32i, !cir.ptr<!s32i>
147+ // CIR: %{{.*}} = cir.load %[[RETVAL]] : !cir.ptr<!s32i>, !s32i
148+ // CIR: cir.return
149+
150+ // LLVM-LABEL: define {{.*}}i32 @ignore_result_assign()
151+ // LLVM: %[[RETVAL_PTR:.*]] = alloca i32
152+ // LLVM: %[[ARR_PTR:.*]] = alloca [10 x i32]
153+ // LLVM: %[[I_PTR:.*]] = alloca i32
154+ // LLVM: %[[J_PTR:.*]] = alloca i32
155+ // LLVM: %[[P_PTR:.*]] = alloca ptr
156+ // LLVM: %[[Q_PTR:.*]] = alloca ptr
157+ // LLVM: store i32 123, ptr %[[I_PTR]]
158+ // LLVM: store i32 123, ptr %[[J_PTR]]
159+ // LLVM: store i32 5, ptr %[[I_PTR]]
160+ // LLVM: %[[GEP1:.*]] = getelementptr i32, ptr %[[ARR_PTR]], i32 0
161+ // LLVM: %[[GEP2:.*]] = getelementptr i32, ptr %[[GEP1]], i64 5
162+ // LLVM: %[[ARR_VAL:.*]] = load i32, ptr %[[GEP2]]
163+ // LLVM: store i32 %[[ARR_VAL]], ptr %[[J_PTR]]
164+ // LLVM: store ptr null, ptr %[[Q_PTR]]
165+ // LLVM: br label
166+ // LLVM: %[[Q_VAL:.*]] = load ptr, ptr %[[Q_PTR]]
167+ // LLVM: store ptr %[[Q_VAL]], ptr %[[P_PTR]]
168+ // LLVM: %[[CMP:.*]] = icmp ne ptr %[[Q_VAL]], null
169+ // LLVM: br i1 %[[CMP]], label %[[THEN:.*]], label %[[ELSE:.*]]
170+ // LLVM: [[THEN]]:
171+ // LLVM: store i32 1, ptr %[[RETVAL_PTR]]
172+ // LLVM: %{{.*}} = load i32, ptr %[[RETVAL_PTR]]
173+ // LLVM: ret i32
174+ // LLVM: [[ELSE]]:
175+ // LLVM: br label
176+ // LLVM: store i32 0, ptr %[[RETVAL_PTR]]
177+ // LLVM: %{{.*}} = load i32, ptr %[[RETVAL_PTR]]
178+ // LLVM: ret i32
179+
180+ // OGCG-LABEL: define {{.*}}i32 @ignore_result_assign()
181+ // OGCG: %[[RETVAL:.*]] = alloca i32
182+ // OGCG: %[[ARR:.*]] = alloca [10 x i32]
183+ // OGCG: %[[I:.*]] = alloca i32
184+ // OGCG: %[[J:.*]] = alloca i32
185+ // OGCG: %[[P:.*]] = alloca ptr
186+ // OGCG: %[[Q:.*]] = alloca ptr
187+ // OGCG: store i32 123, ptr %[[I]]
188+ // OGCG: store i32 123, ptr %[[J]]
189+ // OGCG: store i32 5, ptr %[[I]]
190+ // OGCG: %[[ARRAYIDX:.*]] = getelementptr inbounds [10 x i32], ptr %[[ARR]], i64 0, i64 5
191+ // OGCG: %[[ARR_VAL:.*]] = load i32, ptr %[[ARRAYIDX]]
192+ // OGCG: store i32 %[[ARR_VAL]], ptr %[[J]]
193+ // OGCG: store ptr null, ptr %[[Q]]
194+ // OGCG: %[[Q_VAL:.*]] = load ptr, ptr %[[Q]]
195+ // OGCG: store ptr %[[Q_VAL]], ptr %[[P]]
196+ // OGCG: %[[TOBOOL:.*]] = icmp ne ptr %[[Q_VAL]], null
197+ // OGCG: br i1 %[[TOBOOL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
198+ // OGCG: [[IF_THEN]]:
199+ // OGCG: store i32 1, ptr %[[RETVAL]]
200+ // OGCG: br label %[[RETURN:.*]]
201+ // OGCG: [[IF_END]]:
202+ // OGCG: store i32 0, ptr %[[RETVAL]]
203+ // OGCG: br label %[[RETURN]]
204+ // OGCG: [[RETURN]]:
205+ // OGCG: %{{.*}} = load i32, ptr %[[RETVAL]]
206+ // OGCG: ret i32
0 commit comments