mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
79a692ca89
Disable widening of the IV in LoopFlatten while I investigate an assertion failures. Please note that the pass is also not yet enabled by default.
112 lines
5.9 KiB
LLVM
112 lines
5.9 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -S -loop-flatten -loop-flatten-widen-iv=true -verify-loop-info -verify-dom-info -verify-scev -verify | FileCheck %s --check-prefix=CHECK
|
|
; RUN: opt < %s -S -loop-flatten -loop-flatten-widen-iv=false -verify-loop-info -verify-dom-info -verify-scev -verify | FileCheck %s --check-prefix=DONTWIDEN
|
|
|
|
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
|
|
|
; Function Attrs: nounwind
|
|
define void @foo(i32* %A, i32 %N, i32 %M) {
|
|
; CHECK-LABEL: @foo(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP17:%.*]] = icmp sgt i32 [[N:%.*]], 0
|
|
; CHECK-NEXT: br i1 [[CMP17]], label [[FOR_COND1_PREHEADER_LR_PH:%.*]], label [[FOR_COND_CLEANUP:%.*]]
|
|
; CHECK: for.cond1.preheader.lr.ph:
|
|
; CHECK-NEXT: [[CMP215:%.*]] = icmp sgt i32 [[M:%.*]], 0
|
|
; CHECK-NEXT: br i1 [[CMP215]], label [[FOR_COND1_PREHEADER_US_PREHEADER:%.*]], label [[FOR_COND_CLEANUP]]
|
|
; CHECK: for.cond1.preheader.us.preheader:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[M]] to i64
|
|
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[N]] to i64
|
|
; CHECK-NEXT: [[FLATTEN_TRIPCOUNT:%.*]] = mul i64 [[TMP0]], [[TMP1]]
|
|
; CHECK-NEXT: br label [[FOR_COND1_PREHEADER_US:%.*]]
|
|
; CHECK: for.cond1.preheader.us:
|
|
; CHECK-NEXT: [[INDVAR1:%.*]] = phi i64 [ [[INDVAR_NEXT2:%.*]], [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US:%.*]] ], [ 0, [[FOR_COND1_PREHEADER_US_PREHEADER]] ]
|
|
; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 [[INDVAR1]] to i32
|
|
; CHECK-NEXT: [[MUL_US:%.*]] = mul nsw i32 [[TMP2]], [[M]]
|
|
; CHECK-NEXT: br label [[FOR_BODY4_US:%.*]]
|
|
; CHECK: for.body4.us:
|
|
; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ 0, [[FOR_COND1_PREHEADER_US]] ]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = trunc i64 [[INDVAR]] to i32
|
|
; CHECK-NEXT: [[ADD_US:%.*]] = add nsw i32 [[TMP3]], [[MUL_US]]
|
|
; CHECK-NEXT: [[IDXPROM_US:%.*]] = sext i32 [[ADD_US]] to i64
|
|
; CHECK-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVAR1]]
|
|
; CHECK-NEXT: tail call void @f(i32* [[ARRAYIDX_US]])
|
|
; CHECK-NEXT: [[INDVAR_NEXT:%.*]] = add i64 [[INDVAR]], 1
|
|
; CHECK-NEXT: [[CMP2_US:%.*]] = icmp slt i64 [[INDVAR_NEXT]], [[TMP0]]
|
|
; CHECK-NEXT: br label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US]]
|
|
; CHECK: for.cond1.for.cond.cleanup3_crit_edge.us:
|
|
; CHECK-NEXT: [[INDVAR_NEXT2]] = add i64 [[INDVAR1]], 1
|
|
; CHECK-NEXT: [[CMP_US:%.*]] = icmp slt i64 [[INDVAR_NEXT2]], [[FLATTEN_TRIPCOUNT]]
|
|
; CHECK-NEXT: br i1 [[CMP_US]], label [[FOR_COND1_PREHEADER_US]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]
|
|
; CHECK: for.cond.cleanup.loopexit:
|
|
; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]
|
|
; CHECK: for.cond.cleanup:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
; DONTWIDEN-LABEL: @foo(
|
|
; DONTWIDEN-NEXT: entry:
|
|
; DONTWIDEN-NEXT: [[CMP17:%.*]] = icmp sgt i32 [[N:%.*]], 0
|
|
; DONTWIDEN-NEXT: br i1 [[CMP17]], label [[FOR_COND1_PREHEADER_LR_PH:%.*]], label [[FOR_COND_CLEANUP:%.*]]
|
|
; DONTWIDEN: for.cond1.preheader.lr.ph:
|
|
; DONTWIDEN-NEXT: [[CMP215:%.*]] = icmp sgt i32 [[M:%.*]], 0
|
|
; DONTWIDEN-NEXT: br i1 [[CMP215]], label [[FOR_COND1_PREHEADER_US_PREHEADER:%.*]], label [[FOR_COND_CLEANUP]]
|
|
; DONTWIDEN: for.cond1.preheader.us.preheader:
|
|
; DONTWIDEN-NEXT: br label [[FOR_COND1_PREHEADER_US:%.*]]
|
|
; DONTWIDEN: for.cond1.preheader.us:
|
|
; DONTWIDEN-NEXT: [[I_018_US:%.*]] = phi i32 [ [[INC6_US:%.*]], [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US:%.*]] ], [ 0, [[FOR_COND1_PREHEADER_US_PREHEADER]] ]
|
|
; DONTWIDEN-NEXT: [[MUL_US:%.*]] = mul nsw i32 [[I_018_US]], [[M]]
|
|
; DONTWIDEN-NEXT: br label [[FOR_BODY4_US:%.*]]
|
|
; DONTWIDEN: for.body4.us:
|
|
; DONTWIDEN-NEXT: [[J_016_US:%.*]] = phi i32 [ 0, [[FOR_COND1_PREHEADER_US]] ], [ [[INC_US:%.*]], [[FOR_BODY4_US]] ]
|
|
; DONTWIDEN-NEXT: [[ADD_US:%.*]] = add nsw i32 [[J_016_US]], [[MUL_US]]
|
|
; DONTWIDEN-NEXT: [[IDXPROM_US:%.*]] = sext i32 [[ADD_US]] to i64
|
|
; DONTWIDEN-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[IDXPROM_US]]
|
|
; DONTWIDEN-NEXT: tail call void @f(i32* [[ARRAYIDX_US]])
|
|
; DONTWIDEN-NEXT: [[INC_US]] = add nuw nsw i32 [[J_016_US]], 1
|
|
; DONTWIDEN-NEXT: [[CMP2_US:%.*]] = icmp slt i32 [[INC_US]], [[M]]
|
|
; DONTWIDEN-NEXT: br i1 [[CMP2_US]], label [[FOR_BODY4_US]], label [[FOR_COND1_FOR_COND_CLEANUP3_CRIT_EDGE_US]]
|
|
; DONTWIDEN: for.cond1.for.cond.cleanup3_crit_edge.us:
|
|
; DONTWIDEN-NEXT: [[INC6_US]] = add nuw nsw i32 [[I_018_US]], 1
|
|
; DONTWIDEN-NEXT: [[CMP_US:%.*]] = icmp slt i32 [[INC6_US]], [[N]]
|
|
; DONTWIDEN-NEXT: br i1 [[CMP_US]], label [[FOR_COND1_PREHEADER_US]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]
|
|
; DONTWIDEN: for.cond.cleanup.loopexit:
|
|
; DONTWIDEN-NEXT: br label [[FOR_COND_CLEANUP]]
|
|
; DONTWIDEN: for.cond.cleanup:
|
|
; DONTWIDEN-NEXT: ret void
|
|
;
|
|
entry:
|
|
%cmp17 = icmp sgt i32 %N, 0
|
|
br i1 %cmp17, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
|
|
|
|
for.cond1.preheader.lr.ph:
|
|
%cmp215 = icmp sgt i32 %M, 0
|
|
br i1 %cmp215, label %for.cond1.preheader.us.preheader, label %for.cond.cleanup
|
|
|
|
for.cond1.preheader.us.preheader:
|
|
br label %for.cond1.preheader.us
|
|
|
|
for.cond1.preheader.us:
|
|
%i.018.us = phi i32 [ %inc6.us, %for.cond1.for.cond.cleanup3_crit_edge.us ], [ 0, %for.cond1.preheader.us.preheader ]
|
|
%mul.us = mul nsw i32 %i.018.us, %M
|
|
br label %for.body4.us
|
|
|
|
for.body4.us:
|
|
%j.016.us = phi i32 [ 0, %for.cond1.preheader.us ], [ %inc.us, %for.body4.us ]
|
|
%add.us = add nsw i32 %j.016.us, %mul.us
|
|
%idxprom.us = sext i32 %add.us to i64
|
|
%arrayidx.us = getelementptr inbounds i32, i32* %A, i64 %idxprom.us
|
|
tail call void @f(i32* %arrayidx.us) #2
|
|
%inc.us = add nuw nsw i32 %j.016.us, 1
|
|
%cmp2.us = icmp slt i32 %inc.us, %M
|
|
br i1 %cmp2.us, label %for.body4.us, label %for.cond1.for.cond.cleanup3_crit_edge.us
|
|
|
|
for.cond1.for.cond.cleanup3_crit_edge.us:
|
|
%inc6.us = add nuw nsw i32 %i.018.us, 1
|
|
%cmp.us = icmp slt i32 %inc6.us, %N
|
|
br i1 %cmp.us, label %for.cond1.preheader.us, label %for.cond.cleanup
|
|
|
|
for.cond.cleanup:
|
|
ret void
|
|
}
|
|
|
|
declare dso_local void @f(i32* %0) local_unnamed_addr #1
|