Kai Nacke 5403c59c60 [PPC] Opaque pointer migration, part 2.
The LIT test cases were migrated with the script provided by
Nikita Popov. Due to the size of the change it is split into
several parts.

Reviewed By: nemanja, nikic

Differential Revision: https://reviews.llvm.org/D135474
2022-10-11 17:24:06 +00:00

79 lines
3.0 KiB
LLVM

; RUN: llc -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s
target datalayout = "E-m:e-p:32:32-i64:64-n32"
target triple = "powerpc-unknown-linux-gnu"
; This code would cause code generation like this after PPCCTRLoops ran:
; %indvar = phi i32 [ 0, %for.body ], [ %indvar.next, %if.then6 ]
; %j.1.ph13 = phi i32 [ %j.110, %if.then6 ], [ 0, %for.body ], [ 0, %for.body ]
; %c.0.ph12 = phi i32 [ %dec, %if.then6 ], [ %2, %for.body ], [ %2, %for.body ]
; which would fail verification because the created induction variable does not
; have as many predecessor entries as the other PHIs.
; CHECK-LABEL: @fn1
; CHECK: mtctr
%struct.anon = type { i32 }
%struct.anon.0 = type { i32 }
@b = common global ptr null, align 4
@a = common global ptr null, align 4
; Function Attrs: nounwind readonly uwtable
define i32 @fn1() #0 {
entry:
%0 = load ptr, ptr @b, align 4
%1 = ptrtoint ptr %0 to i32
%cmp = icmp sgt ptr %0, null
%2 = load ptr, ptr @a, align 4
br i1 %cmp, label %for.bodythread-pre-split, label %if.end8
for.bodythread-pre-split: ; preds = %entry
%.pr = load i32, ptr %2, align 4
br label %for.body
for.body: ; preds = %for.bodythread-pre-split, %for.body
switch i32 %.pr, label %for.body [
i32 0, label %while.body.lr.ph.preheader
i32 2, label %while.body.lr.ph.preheader
]
while.body.lr.ph.preheader: ; preds = %for.body, %for.body
br label %while.body.lr.ph
while.body.lr.ph: ; preds = %while.body.lr.ph.preheader, %if.then6
%j.1.ph13 = phi i32 [ %j.110.lcssa, %if.then6 ], [ 0, %while.body.lr.ph.preheader ]
%c.0.ph12 = phi i32 [ %dec, %if.then6 ], [ %1, %while.body.lr.ph.preheader ]
br label %while.body
while.cond: ; preds = %while.body
%cmp2 = icmp slt i32 %inc7, %c.0.ph12
br i1 %cmp2, label %while.body, label %if.end8.loopexit
while.body: ; preds = %while.body.lr.ph, %while.cond
%j.110 = phi i32 [ %j.1.ph13, %while.body.lr.ph ], [ %inc7, %while.cond ]
%aclass_index = getelementptr inbounds %struct.anon, ptr %0, i32 %j.110, i32 0
%3 = load i32, ptr %aclass_index, align 4
%aclass5 = getelementptr inbounds %struct.anon.0, ptr %2, i32 %3, i32 0
%4 = load i32, ptr %aclass5, align 4
%tobool = icmp eq i32 %4, 0
%inc7 = add nsw i32 %j.110, 1
br i1 %tobool, label %while.cond, label %if.then6
if.then6: ; preds = %while.body
%j.110.lcssa = phi i32 [ %j.110, %while.body ]
%dec = add nsw i32 %c.0.ph12, -1
%cmp29 = icmp slt i32 %j.110.lcssa, %dec
br i1 %cmp29, label %while.body.lr.ph, label %if.end8.loopexit17
if.end8.loopexit: ; preds = %while.cond
br label %if.end8
if.end8.loopexit17: ; preds = %if.then6
br label %if.end8
if.end8: ; preds = %if.end8.loopexit17, %if.end8.loopexit, %entry
ret i32 undef
}
attributes #0 = { nounwind readonly uwtable }