Skip to content

Commit 3ff7892

Browse files
committed
[SLP] Add test case showing missing CSE in hoisted instructions.
1 parent 1819d59 commit 3ff7892

File tree

1 file changed

+46
-0
lines changed
  • llvm/test/Transforms/SLPVectorizer/X86

1 file changed

+46
-0
lines changed

llvm/test/Transforms/SLPVectorizer/X86/cse.ll

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,49 @@ if.end13: ; preds = %if.then12, %sw.epil
347347
%b.0 = phi double [ %3, %if.then12 ], [ %add10, %sw.epilog7 ], [ undef, %entry], [ undef, %entry ]
348348
unreachable
349349
}
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

Comments
 (0)