@@ -956,6 +956,40 @@ if.end:
956
956
ret <vscale x 2 x i32 > %e
957
957
}
958
958
959
+ ; This case demonstrates a PRE oppurtunity where the first instruction
960
+ ; in the block doesn't require a state transition. Essentially, we need
961
+ ; to FRE the transition to the start of the block, and *then* PRE it.
962
+ define void @pre_over_vle (ptr %A ) {
963
+ ; CHECK-LABEL: pre_over_vle:
964
+ ; CHECK: # %bb.0: # %entry
965
+ ; CHECK-NEXT: li a1, 0
966
+ ; CHECK-NEXT: li a2, 800
967
+ ; CHECK-NEXT: .LBB22_1: # %vector.body
968
+ ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
969
+ ; CHECK-NEXT: add a3, a0, a1
970
+ ; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
971
+ ; CHECK-NEXT: vle8.v v8, (a3)
972
+ ; CHECK-NEXT: vsext.vf4 v9, v8
973
+ ; CHECK-NEXT: addi a1, a1, 8
974
+ ; CHECK-NEXT: vse32.v v9, (a3)
975
+ ; CHECK-NEXT: bne a1, a2, .LBB22_1
976
+ ; CHECK-NEXT: # %bb.2: # %exit
977
+ ; CHECK-NEXT: ret
978
+ entry:
979
+ br label %vector.body
980
+
981
+ vector.body:
982
+ %iv = phi i64 [ 0 , %entry ], [%iv.next , %vector.body ]
983
+ %addr = getelementptr inbounds <2 x i32 >, ptr %A , i64 %iv
984
+ %v = load <2 x i8 >, ptr %addr
985
+ %v2 = sext <2 x i8 > %v to <2 x i32 >
986
+ store <2 x i32 > %v2 , ptr %addr
987
+ %iv.next = add i64 %iv , 1
988
+ %cmp = icmp ne i64 %iv.next , 100
989
+ br i1 %cmp , label %vector.body , label %exit
990
+ exit:
991
+ ret void
992
+ }
959
993
960
994
declare i64 @llvm.riscv.vsetvlimax.i64 (i64 , i64 )
961
995
declare <vscale x 1 x double > @llvm.riscv.vle.nxv1f64.i64 (<vscale x 1 x double >, <vscale x 1 x double >* nocapture , i64 )
0 commit comments