@@ -347,3 +347,49 @@ if.end13: ; preds = %if.then12, %sw.epil
347
347
%b.0 = phi double [ %3 , %if.then12 ], [ %add10 , %sw.epilog7 ], [ undef , %entry ], [ undef , %entry ]
348
348
unreachable
349
349
}
350
+
351
+ define void @cse_for_hoisted_instructions_in_preheader (i32* %dst , i32 %a , i1 %c ) {
352
+ ; CHECK-LABEL: @cse_for_hoisted_instructions_in_preheader(
353
+ ; CHECK-NEXT: entry:
354
+ ; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i32> poison, i32 [[A:%.*]], i32 0
355
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[A]], i32 1
356
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> poison, i32 [[A]], i32 0
357
+ ; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i32> [[TMP2]], i32 [[A]], i32 1
358
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
359
+ ; CHECK: loop:
360
+ ; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> <i32 22, i32 22>, [[TMP1]]
361
+ ; CHECK-NEXT: [[GEP_0:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 0
362
+ ; CHECK-NEXT: [[TMP5:%.*]] = or <2 x i32> [[TMP4]], <i32 3, i32 3>
363
+ ; CHECK-NEXT: [[TMP6:%.*]] = bitcast i32* [[GEP_0]] to <2 x i32>*
364
+ ; CHECK-NEXT: store <2 x i32> [[TMP5]], <2 x i32>* [[TMP6]], align 4
365
+ ; CHECK-NEXT: [[TMP7:%.*]] = or <2 x i32> [[TMP3]], <i32 3, i32 3>
366
+ ; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 10
367
+ ; CHECK-NEXT: [[TMP8:%.*]] = bitcast i32* [[GEP_2]] to <2 x i32>*
368
+ ; CHECK-NEXT: store <2 x i32> [[TMP7]], <2 x i32>* [[TMP8]], align 4
369
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP]], label [[EXIT:%.*]]
370
+ ; CHECK: exit:
371
+ ; CHECK-NEXT: ret void
372
+ ;
373
+ entry:
374
+ br label %loop
375
+
376
+ loop:
377
+ %or.a = or i32 22 , %a
378
+ %or.0 = or i32 %or.a , 3
379
+ %gep.0 = getelementptr inbounds i32 , i32* %dst , i64 0
380
+ store i32 %or.0 , i32* %gep.0
381
+ %or.a.2 = or i32 22 , %a
382
+ %or.1 = or i32 %or.a.2 , 3
383
+ %gep.1 = getelementptr inbounds i32 , i32* %dst , i64 1
384
+ store i32 %or.1 , i32* %gep.1
385
+ %or.2 = or i32 %a , 3
386
+ %gep.2 = getelementptr inbounds i32 , i32* %dst , i64 10
387
+ store i32 %or.2 , i32* %gep.2
388
+ %or.3 = or i32 %a , 3
389
+ %gep.3 = getelementptr inbounds i32 , i32* %dst , i64 11
390
+ store i32 %or.3 , i32* %gep.3
391
+ br i1 %c , label %loop , label %exit
392
+
393
+ exit:
394
+ ret void
395
+ }
0 commit comments